Aula 00 Desenvolvimento de Software para Concursos - Curso Regular Professor: Diego Carvalho
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
AULA 00
SUMÁRIO
PÁGINA 01 11 32 36 42 64 74
Apresentação - Lógica de Programação - Funções e Procedimentos - Complexidade de Algoritmos - Métodos de Ordenação Lista de Exercícios Comentados Gabarito
Lógica de Programação. Tipos de Dados. Operadores e Expressões. Estruturas de Controle, Seleção, Repetição e Desvio. Recursividade. Funções e Procedimentos. Complexidade de Algoritmos. Métodos de Ordenação. BubbleSort, InsertionSort, SelectionSort, QuickSort, ShellSort, MergeSort e HeapSort. Estruturas de Dados. Vetores e Matrizes. Lista Encadeada. Pilhas. Filas. Árvore. Grafos. Hashing. Estrutura de Arquivos. Padrões de Projeto GOF. Padrões de Projeto Java EE. Padrões de Projeto GRASP. Java SE. Conceitos Básicos. Plataforma Java. Compilação e Interpretação. agem por Valor e Referência. Empacotamento. Raiz. Identificadores. Blocos e Comandos. Comentários. Palavras Reservadas. Tipos Primitivos. Operadores. Vetores. Conversão de Tipos. Controle de Fluxos. Classes. Objetos. Atributos. Métodos. Herança. Encapsulamento. Interface. Polimorfismo. Interface Gráfica. Tipos Enumerados. Anotações. Classes Internas. Reflexão e Genéricos. Tratamento de Exceções. Sincronismo e Multithreading. Coleções. Streams e Serialização. Classes e Operações de I/O. Novidades Java 8. Arquitetura Java EE. JSP. Servlets. JSF. JPA. Hibernate. JDBC. JVM. Spring. Struts. JMS. JNDI. JTA. JSTL. HTML e CSS. JavaScript. JQuery. AJAX. DHTML. XHTML. XML. XSLT. XSD. Sistemas Móveis. Android. iOS. Segurança no Desenvolvimento. Compiladores e Interpretadores. Ferramentas de Controle de Versão. SVN. CVS. Git. Análise Estática de Código-Fonte. SonarQube. Integração Contínua (e outros) Framework .NET, C#, Visual Basic, ASP.NET e Visual Studio (Prof. Mayara Rosa) Delphi e PHP (Prof. Mayara Rosa). 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 1 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
APRESENTAÇÃO. Olá, pessoal. Sejam bem-vindos ao Curso Regular de Desenvolvimento de Software! Galera, depois de receber dezenas de pedidos requisitando um curso que ajudasse alunos a se prepararem com certa antecedência para concursos, resolvemos lançar cursos regulares! Esse curso está redondo, muito maduro e com um bocado de exercícios. Aqui você encontrará o conteúdo mais comum em qualquer edital de engenharia de software. O cenário político/fiscal atual não está muito favorável para os concursos, porém, sa é a hora de começar a estudar e ter uma vantagem sobre os concorrentes. Precisa falar que Desenvolvimento de Software é importante? Precisa falar que você tem que saber tudo sobre a Arquitetura Java EE, sobre Algoritmos de Ordenação, Padrões de Projeto, HTML/CSS/JavaScript? Precisa falar que cai muito em discursivas e que, por exemplo, o tema da última discursiva do Senado foi Estrutura de Dados?
DÚVIDAS DOS ALUNOS
TOP 5 1.
Peço encarecidamente que leiam as instruções dessa primeira aula. Eu sei que é chato, mas assim nós alinhamos nossas expectativas a respeito do curso. 16712855225
2. Essa é a Aula Demonstrativa (está disponível para todos na internet) – o restante do conteúdo estará disponível na Aula 01 (apenas para aqueles que adquirirem o curso). 3. Esse curso não possui vídeo-aulas! Estamos trabalhando para disponibilizá-las em breve, nesse primeiro semestre – talvez ainda não seja possível disponibilizá-las para esse curso. 4. Esse curso contempla somente aquilo que está em seu cronograma. Ele não contempla todo edital de tecnologia da informação, nem outras disciplinas, nem discursivas, estudos de caso, etc. 5. Existem questões de Múltipla Escolha (A, B, C, D, E) e existem questões de Certo/Errado (C, E). Quando não há itens para escolha na questão, é porque a questão é da Modalidade Certo/Errado. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 2 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
O PROFESSOR Uma breve apresentação: meu nome é Diego Carvalho, bacharel em Ciência da Computação pela Universidade de Brasília, pós-graduado em Gestão de Tecnologia da Informação na istração Pública e Analista de Finanças e Controle da Secretaria do Tesouro Nacional. Já ei por esses perrengues de concurseiro e sei de duas coisas: a estrada é difícil, mas o prêmio compensa! E muito!
www.facebook.com/professordiegocarvalho ÁREA
ÓRGÃOS PARA OS QUAIS JÁ MINISTREI CURSOS
Agência
ANCINE
ANTAQ
ANATEL
Jurídica
TRT/2 CNMP
TRT/3 MP/PB
TRT/4 TRT/15
TCE/SP TCM/SP ISS/BA
TCE/CE
TCM/GO
Fiscal
TRT/1 TJ/BA CÂMARA DOS DEPUTADOS TCE/RS TCU ISS/SP
Outros
CEF
DATAPREV
DEPEN
INMETRO
Legislativa Auditoria
16712855225
Neste curso, contaremos também com a Professora Mayara Rosa! Ela também é bacharel em Ciência da Computação na Universidade de Brasília (UnB), pósgraduada em Engenharia de Sistemas e recentemente tomou posse como Auditora Federal de Controle Externo no Tribunal de Contas da União (TCU). Ela é a nova professora do Estratégia Concursos! ;) Galera, lá no site, nós – professores – temos algumas métricas para medir se o nosso desempenho nos cursos está bacana! Os alunos podem avaliar com notas e, inclusive, escrever anonimamente o que acharam do professor e do curso. Apresento abaixo o resultado de alguns cursos ministrados recentemente. Portanto, confiem em mim... vocês vão aprender muito com esse curso!
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 3 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 4 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 5 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 6 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
O CURSO... Antes de começar o curso, vamos alinhar algumas expectativas! O curso que eu proponho abrangerá todo o conteúdo do meu cronograma, entretanto é impossível e inviável esgotar cada ponto do edital em uma aula escrita. Como se ministra Java em uma aula? Teríamos uma aula de 800 páginas e não chegaríamos nem perto de matar todo conteúdo! Imaginem agora cada ponto do Edital. Portanto, vou direcioná-los pelo conteúdo da melhor maneira possível. O nosso foco é ter uma visão geral, mas objetiva do que de fato cai em prova e, não, elucubrações sobre cada tema. Meu foco aqui é te fazer ar! Eu sei como é complicado ler muita coisa (ainda mais de TI) e vocês têm outras disciplinas para estudar. Logo, vou ser simples e objetivo! Tranquilo? ;) Além disso, o cronograma será seguido com a maior fidelidade possível, mas ele não é estático e poderá haver alterações no decorrer do curso. Eventualmente, posso tirar o conteúdo de uma aula e colocar em outra de forma que o estudo de vocês fique mais lógico, coeso e fácil de acompanhar; posso também inverter a ordem das aulas (adiantar uma aula e atrasar outra) – sem prejudicá-los. Além disso, vamos usar questões de diversas bancas. Enfim, confiem em mim: o curso vai ajudar bastante! Qualquer dúvida, é só me chamar! Caso haja alguma reclamação, problema, sugestão, comentários, erros de digitação, etc, podem enviar para o nosso fórum que eu tento responder da maneira mais tempestiva possível. Ainda duvidam que PDF não dá certo com Concursos de TI? Veja abaixo: 6º Lugar – ISS/Salvador https://www.youtube.com/watch?v=b1w4H3l6mC4#t=1678 16712855225
1º Lugar – TRT/RJ https://www.facebook.com/video.php?v=790616534367672 2º Lugar – ISS/Salvador https://www.youtube.com/watch?v=vmU1n1J-aqQ 1º Lugar – Dataprev http://www.estrategiaconcursos.com.br/blog/entrevista-andre-furtado-aprovado-em-1o-lugarno-concurso-dataprev-para-o-cargo-de-analistaarea-de-tecnologia-da-informacao/
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 7 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
CRONOGRAM
Aula 00
Data 24/03
Tópicos do Edital Lógica de Programação. Tipos de Dados. Operadores e Expressões. Estruturas de Controle, Seleção, Repetição e Desvio. Recursividade. Funções e Procedimentos. Complexidade de Algoritmos. Métodos de Ordenação. BubbleSort, InsertionSort, SelectionSort, QuickSort, ShellSort, MergeSort e HeapSort.
01
01/04
Estruturas de Dados. Vetores e Matrizes. Lista Encadeada. Pilhas. Filas. Árvore. Grafos. Hashing. Estrutura de Arquivos.
02
15/04
Padrões de Projeto GOF. Padrões de Projeto Java EE. Padrões de Projeto GRASP.
03
01/05
Java SE. Conceitos Básicos. Plataforma Java. Compilação e Interpretação. agem por Valor e Referência. Empacotamento. Raiz. Identificadores. Blocos e Comandos. Comentários. Palavras Reservadas. Tipos Primitivos. Operadores. Vetores. Conversão de Tipos. Controle de Fluxos. Classes. Objetos. Atributos. Métodos. Herança. Encapsulamento. Interface. Polimorfismo. Interface Gráfica. Tipos Enumerados. Anotações. Classes Internas. Reflexão e Genéricos. Tratamento de Exceções. Sincronismo e Multithreading. Coleções. Streams e Serialização. Classes e Operações de I/O. Novidades Java 8.
04
15/05
Arquitetura Java EE. JSP. Servlets. JSF.
05
01/06
JPA. Hibernate. JDBC. JVM.
06
15/06
Spring. Struts. JMS. JNDI. JTA. JSTL.
07
01/07
HTML e CSS.
08
15/07
JavaScript. JQuery. AJAX.
09
01/08
DHTML. XHTML. XML. XSLT. XSD.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 8 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
10
15/08
Sistemas Móveis. Android. iOS. Segurança no Desenvolvimento. Compiladores e Interpretadores.
11
01/09
Ferramentas de Controle de Versão. SVN. CVS. Git. Análise Estática de Código-Fonte. SonarQube. Integração Contínua (e outros)
12
15/09
Framework .NET, C#, Visual Basic, ASP.NET e Visual Studio (Prof. Mayara Rosa)
13
01/10
Delphi e PHP (Prof. Mayara Rosa).
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 9 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
AS AULAS E AS DICAS 1 – Parágrafos pequenos: observem que os parágrafos têm, no máximo, cinco linhas. Isso serve para que a leitura não fique cansativa e para que vocês não desanimem no meio do material! Para tal, eu tento dividir as disciplinas de maneira que as aulas fiquem objetivas e pequenas (em termos de teoria), mas extensa (em termos de exercícios). 3 – Destaques em vermelho: quase todos os parágrafos possuem alguma palavra ou frase destacada em negrito e em vermelho. Isso ocorre por suas razões: primeiro, para enfatizar alguma informação importante; segundo, para facilitar a leitura vertical, i.e., após uma primeira leitura, a segunda pode ser ando apenas pelos pontos em destaque. 5 – Linguagem natural: essa é uma aula para ser lida, o que por si só já pode ser cansativo. Tentarei colocar a linguagem mais coloquial possível, simulando uma conversa. Portanto, caso virem frases ou palavras em itálico, ou é uma palavra estrangeira ou é a simulação de uma conversa com vocês. Pode dar um exemplo, professor? Acabei de dar! :-) 7 – Diversas figuras: essas aulas estarão em constante evolução, sempre à procura de explicar as matérias de maneira mais compreensível e com novas informações/questões. Para tal, na minha opinião, é fundamental a utilização de figuras, gráficos, painéis, etc. Em minha experiência, é bem mais fácil memorizar a partir de imagens. 9 – Fazer Exercícios: muitos exercícios é o meio pelo qual vocês se situarão. Como assim, professor? É na hora de fazer os exercícios que vocês descobrirão se estão bem ou mal e avaliarão se precisam estudar mais ou menos. Para tal, há um quadrinho ao final de cada bloco de exercícios para vocês anotarem a quantidade de questões respondidas corretamente ou incorretamente. 16712855225
2 – Visão Geral: não se atenham a detalhes antes de entender o básico. Por que? Ora, não há nada mais irritante do que ir para uma prova que vai cair, por exemplo, RUP, saber vários detalhes, mas não saber as fases e disciplinas. Portanto, caso estejam iniciando os estudos sobre uma matéria, foquem em saber o básico para depois se especializarem. 4 – Façam muitos exercícios: ler várias bibliografias é muito trabalhoso e, geralmente, não vale o custobenefício. Acredito que o que funciona mesmo é entender o básico, depois fazer muitos exercícios e, eventualmente, caso encontrarem algo que não souberem, pesquisem-no separadamente. Além disso, você vai pegando as “manhas” da banca. 6 – Façam resumos: essa dica somente serve caso vocês tenham disponibilidade. Caso haja pouco tempo para estudar ou pouco tempo até a prova, não compensa! Se não, façam resumos organizados, pois eles economizarão um bom tempo de estudo em suas próximas provas e sempre que descobrirem novas informações, insiram-nas no resumo. 8 – Revisem antes da prova: não adianta querer estudar coisas novas até o último minuto antes da prova e não revisar o que estudou há um mês. Vocês irão esquecer e irão se irritar na hora da prova por não lembrarem de conceitos simples. Tirem uma semana para revisar seus resumos, decorarem algumas coisas e, certamente, irão mais confiantes para a prova. 10 – Simulado Final: ora, fazer um bloco de questões depois de estudar a teoria é tranquilo. No entanto, lembrem-se que a memória de vocês não é infinita e vocês têm um milhão de outras coisas para estudar e decorar. Portanto, se possível, ao fim do curso faremos um simulado com questões escolhidas que foram comentadas dentro das aulas.
Bem, pessoal! É isso... sejam bem-vindos! Espero que vocês curtam e tenham uma leitura leve e despojada da aula, mas com muito foco, atenção e dedicação. Qualquer dúvida, podem entrar em contato comigo – ficarei feliz em ajudá-los. Bons estudos, estou torcendo por vocês!
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 10 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LÓGICA DE PROGRAMAÇÃO Vamos falar sobre Lógica de Programação! Em primeiro lugar, por que chamamos de lógica? Porque é necessário utilizar a lógica para resolver um problema computacional. Como assim? Precisamos de um encadeamento ou uma sequência de pensamentos para alcançar um determinado objetivo. Nós podemos descrever esses pensamentos como uma sequência de instruções ou os. Professor, o que seria uma instrução? É um conjunto de regras ou normas definidas para a realização ou emprego de algo, indicando ao computador uma ação elementar a ser executada. Bem, esses conceitos são muito básicos e vocês já devem estar bastante acostumados, por isso vamos ver rapidamente. Um conjunto de instruções formam um algoritmo: Algoritmo: conjunto predeterminado e bem definido de os destinados à solução de um problema, com um número finito de etapas.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 11 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Professor, você pode dar um exemplo? Sim, o exemplo mais comum da bibliografia é mostrado acima: uma receita de bolo. Observem que para fazer um bolo (solucionar um problema), é necessário seguir uma sequência de os finitos e predeterminados. No fim das contas, grosso modo, um software nada mais é do que a representação de um algoritmo. Professor, todos os programas que eu utilizo no meu computador são representações de algoritmos? Sim! Inclusive o joguinho de Paciência que eu curto? Sim! Mas até mesmo os apps que eu utilizo no celular? Eles também! Todos os softwares (de desktop, notebook, smartphone, tablet, geladeira, relógio, entre outros) são representações de algoritmos. Então, basta que eu escreva um conjunto de os em qualquer língua que o meu computador realiza a tarefa que eu quiser? Claro que não! Computadores não entendem, por exemplo, português – eles entendem 0 e 1 (na verdade, eles necessário entendem presença ou ausência de tensão elétrica), portanto representar esses algoritmos por meio de uma linguagem de programação. Como assim, professor? Pessoal, um computador é uma grande calculadora. No entanto, ele é “burro”, ele só calcula o que mandam-no calcular. linguagens de programação surgem como uma solução para abstrair a comunicação entre seres humanos e computadores. Na imagem ao lado, a ordem do programador era: “Computador, escreva na tela: Hello World!”. Bem, acho que todo mundo já ouviu falar alguma vez na vida em Código-Fonte. Todo software possui um código-fonte, que é um conjunto de palavras organizado de acordo com regras específicas, formando um ou mais algoritmos. Essas palavras que formam o algoritmo são escritas utilizando uma linguagem de programação. Esse código-fonte é traduzido e posteriormente executado pelo usuário. 16712855225
Pessoal... se eu não souber uma linguagem de programação, eu posso escrever um algoritmo utilizando um pseudocódigo! O que é isso, professor? É uma forma genérica de escrever um algoritmo, utilizando uma linguagem simples sem necessidade de conhecer a sintaxe de nenhuma linguagem de programação. Tratase de um pseudo-código, logo não pode ser executado em um sistema real. Um tipo de pseudocódigo é o Portugol (ou Português Estruturado)! Trata-se de uma simplificação extrema da língua portuguesa, limitada a pouquíssimas palavras e Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 12 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
estruturas que têm significado pré-definido, na medida em que deve seguir um padrão. Emprega uma linguagem intermediária entre a linguagem natural e a linguagem de programação para descrever os algoritmos. Embora o Portugol seja uma linguagem bastante simplificada, possui todos os elementos básicos e uma estrutura semelhante à de uma linguagem de programação de computadores. Portanto resolver problemas com português estruturado pode ser uma tarefa tão complexa quanto a de escrever um programa em uma linguagem de programação qualquer. início
se
então
senão
fim_se fim
Além do português estruturado, é possível representar um algoritmo também por meio de um Fluxograma! O que é isso, professor? É uma espécie de diagrama utilizado para documentar processos, ajudando o leitor a visualizá-los, compreendê-los mais facilmente e encontrar falhas ou problemas de eficiência, como mostra a imagem abaixo.
16712855225
Os principais símbolos de um Fluxograma são:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 13 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Bem, nós vimos então que podemos representar algoritmos por meio de Linguagens de Programação, Pseudocódigo ou Fluxogramas! Em geral, os fluxogramas são mais utilizados para leigos; pseudocódigo para usuários um pouco mais avançados; e linguagens de programação para os avançados. Agora vamos falar de conceitos mais específicos: constantes, variáveis e atribuições! Constantes são dados que simplesmente não variam com o tempo, i.e., possuem sempre um valor fixo invariável. Por exemplo: a constante matemática é (sempre foi e sempre será) igual a 3.141592 – esse valor não mudará! Professor, e o que seria uma variável? São espaços na memória do computador reservados para guardar informações ou dados! Em geral, variáveis são associadas a posições na Memória RAM, armazenando diversos tipos de dados que veremos com detalhes à frente! Ela possui um nome identificador que abstrai o nome do endereço na memória que ela ocupa. Observem a imagem abaixo: existe uma variável (espaço em memória) chamada numeroDaConta em que se armazena o valor 4823. 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 14 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
O conteúdo de uma variável pode ser alterado, consultado ou apagado diversas vezes durante a execução de um algoritmo, porém o valor apagado é perdido. Bacana, mas e a atribuição? Bem, trata-se de uma notação para associar um valor a uma variável, i.e., armazenar o conteúdo no endereço de memória específico. Cada linguagem de programação adotará uma maneira de representá-la. Aqui, não iremos nos prender a uma linguagem de programação, vamos adotar o Português Estruturado! A notação de atribuição é representada por uma seta apontando para a esquerda do valor para o identificador, podendo ser: Variável Variável Variável
Constante: Variável: Expressão:
dataDeNascimento 1988 endereço cidade idade (anoAtual anoDeNascimento)
Vamos falar agora sobre tipos de dados! Em geral, eles se dividem em dois grupos: Dados Elementares e Dados Estruturados. Só uma informação antes de começar: os dados elementares também podem ser chamados de simples, básicos, nativos ou primitivos. Já os dados estruturados também podem ser chamados de compostos. Bacana? Vamos para as definições! Tipos Elementares: são aqueles que não podem ser decompostos. Ora, se eu disser que o Pedrinho tem 10 anos, é possível decompor esse valor de idade? Não, logo é um tipo elementar. Há diversos tipos elementares, dependendo da linguagem de programação utilizada. No entanto, os principais são: o Inteiro: também conhecido como Integer, são similares aos números inteiros da matemática, i.e., sem parte fracionária. Podem ser positivos, negativos ou nulos. Ex: -2% de crescimento do PIB; 174 km de distância; 0 ºC de Temperatura; etc. 16712855225
o Real: também conhecido como Float (Ponto Flutuante), são similares aos números reais da matemática, i.e., possuem parte fracionária. Ex: 3,141592 é a constante de PI; 9,81 m/s² de Aceleração Gravitacional; raiz quadrada de 7; etc. o Caractere: também conhecido como Literal ou Char, são representações de letras, dígitos e símbolos. Quando colocadas em conjunto, formam um tipo estruturado chamado String ou Cadeia de Caracteres. Ex: ‘a’, ‘$’, ‘5’, ‘D’, etc.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 15 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
o Lógico: também conhecido como Boolean, são representações de valores lógicos – verdadeiro/falso, ligado/desligado, sim/não, etc. São extremamente importantes na programação, principalmente na verificação de condições. Tipos Estruturados: são aqueles que podem ser decompostos. Ora, se eu disser que o nome da bola da copa é Brazuca, é possível decompor esse nome? Sim, basta dividi-lo em caracteres: ‘B’, ‘r’, ‘a’, ‘z’, ‘u’, ‘c’, ‘a’. Há infinitos tipos estruturados1, pois eles são a combinação de vários outros, o mais comum é: o Cadeia de Caracteres: também conhecido como String, são representações de sequências de caracteres, incluindo ou não símbolos. Pode ser uma palavra, frase, código, etc, por exemplo: “O rato roeu a roupa do rei de Roma”. Pessoal, quase todas as linguagens de programação possuem instruções para Leitura e Escrita de dados. A Escrita é uma Saída de Dados (Output) que busca mostrar informações ao usuário na tela do computador (Ex: Escrever (idade)). A Leitura é uma Entrada de Dados (Input) que busca ler dados do usuário por meio teclado (Ex: Ler (idade)). Para manipular dados, utilizamos operadores: Operadores Aritméticos: são utilizados para obter resultados numéricos, preocupando-se com a priorização2.
Operador Multiplicação Divisão Adição Subtração Exponenciação
16712855225
Símbolo * / + ^
Prioridade 2º 2º 3º 3º 1º
Operadores Relacionais: são utilizados para comparar números e literais, retornando valores lógicos.
Operador Igual a
Símbolo =
1
Uma música em .mp3, um texto em .pdf, uma imagem em jpg são todos tipos estruturados. Em operadores que possuem a mesma prioridade, o que aparecer primeiro deve ser priorizado! Além disso, parênteses possuem sempre a maior prioridade! 2
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 16 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Diferente de Maior que Menor que Maior ou igual a Menor ou igual a
<> ou != > < >= <=
Operadores Lógicos: servem para combinar resultados de expressões, retornando valores lógicos (verdadeiro ou falso).
Operador/Símbolo E/And Ou/Or Não/Not Bacana! Com isso, já podemos falar sobre Estruturas de Decisão e Repetição! Galera, as Estruturas de Decisão (também chamadas de Estruturas de Seleção) permitem interferir na sequência de instruções executadas dependendo de uma condição de teste, i.e., o algoritmo terá caminhos diferentes para decisões diferentes. A melhor maneira de se visualizar isso é com fluxogramas:
Caso 1: Se (Média >= 5.0) Então Aluno = Aprovado
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 17 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Caso 2: Se (Média >= 5.0) Então Aluno = Aprovado Senão Aluno = Reprovado
Caso 3: Se (Média >= 5.0) Então Se (Média >= 7.0) Então Aluno = Aprovado Senão Aluno = Recuperação Senão Aluno = Reprovado 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 18 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Caso 4: Selecione (Número) Caso 13: Presidente Caso 20: Presidente Caso 28: Presidente Caso 43: Presidente Caso 45: Presidente Caso 50: Presidente Caso Outro: Presidente Fim Selecione
Dilma Pastor Everaldo Levy Fidelix Eduardo Jorge Aécio Neves Luciana Genro Nulo
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 19 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Portanto vimos quatro casos de Estrutura de Decisão: -Então, Se-Então-Senão, -Então (Aninhados) e Caso-Selecione. Agora veremos Estruturas de Repetição! Elas são utilizadas quando se deseja que um determinado conjunto de instruções ou comandos sejam executados por uma quantidade definida ou indefinida de vezes, ou enquanto um estado se mantenha ou seja alcançado. Vejamos:
Caso 1: Repetição Pré-Testada (Testa-se antes de processar!) Enquanto (Votos < 1.000) Faça Votos = Votos + 1 Fim-Enquanto
16712855225
Caso 2: Repetição com Variável de Controle Para Votos de 1 até 1000 Faça Votos = Votos + 1 Fim-Enquanto
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 20 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Caso 3: Repetição Pós-Testada (Testa-se depois de processar!) Faça Votos = Votos + 1 Enquanto (Votos < 1.000)
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 21 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Por fim, vamos falar sobre recursividade! O que é isso, professor? Formalmente, é uma maneira de solucionar um problema por meio da instanciação de instâncias menores do mesmo problema. Grosso modo, a recursão é uma técnica em que uma função chama a si mesma. Eu gosto de pensar em recursividade por meio de imagens como as apresentadas abaixo.
Nós dissemos que se trata de uma função que chama a si mesma e, daí, temos o nosso primeiro problema. Se ela chama a si mesma sempre, não entra em um loop infinito? Sim, por isso é necessário um caso-base (solução trivial), i.e., um caso mais simples em que é utilizada uma condição de parada, que resolve o problema. Toda recursividade é composta por um caso base e pelas chamadas recursivas. Vantagens da recursividade: torna a escrita do código mais simples, elegante e, muitas vezes, menor. Desvantagens da recursividade: quando o loop recursivo é muito grande, é consumida muita memória nas chamadas a diversos níveis de recursão, tendo em vista que cada chamada recursiva aloca memória para os parâmetros, variáveis locais e de controle. 16712855225
Em muitos casos, uma solução iterativa gasta menos memória e torna-se mais eficiente em termos de performance do que usar recursão. Galera, vocês se lembram que estudaram fatorial na escola? Pois é, fatorial é uma operação matemática em que um número natural (representado por n!) é o produto de todos os inteiros positivos menores ou iguais a n.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 22 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Professor, facilita aí. Já saí da escola há muito tempo. Ok! Fatorial(5) = 5x4x3x2x1; uma maneira diferente de escrever isso é: Fatorial(5) = 5 x Fatorial(4), que é o mesmo que dizer 5 x (4 x Fatorial(3)), que é o mesmo que 5 x (4 x (3 x Fatorial(2))), que é o mesmo que 5 x (4 x (3 x (2 x Fatorial(1)))). E agora, professor? Agora é a vez do caso-base! No caso do fatorial, o caso-base é: Fatorial(1) = 1. Todas essas instâncias ficaram em memória aguardando a chegada do caso-base e agora retornamos com os resultados. Dado o casobase, temos que: 5 x (4 x (3 x (2 x Fatorial(1)))), logo 5 x (4 x (3 x (2 x 1))) = 120. Vejam ao lado a imagem da a execução de um código representando o fatorial. Por fim, gostaria de mencionar que existem dois tipos de recursividade: direta e indireta. De modo bem simples, a recursividade direta é aquela tradicional em que uma função chama a si mesma (Ex: Função A chama a Função A); a recursividade indireta é aquela alternativa em que uma função chama outra função que chama a primeira (Ex: Função A chama a Função B, que chama a Função A).
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 23 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(FCC - 2010 -SP - Agente de Defensoria - Analista de Sistemas É utilizada para avaliar uma determinada expressão e definir se um bloco de código deve ou não ser executado. Essa é a definição da estrutura condicional: a) For b) If...Then...Else c) While d) Do...While e) Next Comentários: Pessoal... falou em estrutura condicional, trata-se de decisão! Logo, é o If-Then-Else. Gabarito: B (FCC 0 – TRT/SE - Analista de Sistemas Objeto que se constitui parcialmente ou é definido em termos de si próprio. Nesse contexto, um tipo especial de procedimento (algoritmo) será utilizado, algumas vezes, para a solução de alguns problemas. Esse procedimento é denominado: a) Recursividade. b) Rotatividade. c) Repetição. d) Interligação. e) Condicionalidade.
16712855225
Comentários: Por fim, vamos falar sobre recursividade! O que é isso, professor? Formalmente, é uma maneira de solucionar um problema por meio da instanciação de instâncias menores do mesmo problema. Grosso modo, a recursão é uma técnica em que uma função chama a si mesma. Eu gosto de pensar em recursividade por meio de imagens como as apresentadas abaixo. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 24 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Conforme vimos em aula, trata-se da recursividade. Gabarito: A (FCC – TJ/SE - Analista de Sistemas A recursividade na programação de computadores envolve a definição de uma função que: a) apresenta outra função como resultado. b) aponta para um objeto. c) aponta para uma variável. d) chama uma outra função. e) pode chamar a si mesma. Comentários: Por fim, vamos falar sobre recursividade! O que é isso, professor? Formalmente, é uma maneira de solucionar um problema por meio da instanciação de instâncias menores do mesmo problema. Grosso modo, a recursão é uma técnica em que uma função chama a si mesma. Eu gosto de pensar em recursividade por meio de imagens como as apresentadas abaixo. Conforme vimos em aula, ela pode chamar a si mesma. Gabarito: E (CESPE - 2011 - -ES - Técnico de Informática - Específicos Uma estrutura de repetição possibilita executar um bloco de comando, repetidas vezes, até que seja encontrada uma dada condição que conclua a repetição. 16712855225
Comentários: Essa é uma definição perfeita da Estrutura de Repetição. Gabarito: C (CESPE - 2010 - MPU - Analista de Informática - Desenvolvimento de Sistemas Se um trecho de algoritmo tiver de ser executado repetidamente e o número de repetições for indefinido, então é correto o uso, no início desse trecho, da estrutura de repetição Enquanto. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 25 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Comentários: Perfeito! Lembram-se que nós temos três estruturas de repetição? Pois é, o Enquanto-Faça serve para esse propósito! Gabarito: C (CESPE - 2013 - CNJ - Programador de computador) No fluxograma abaixo, se A = 4, B = 4 e C = 8, o resultado que será computado para Área é igual a 32.
Comentários: 16712855225
Vamos lá: P = (4+4+8)/2 Lembrem-se que parênteses sempre têm prioridade: P = (16)/2 = 8 Seguimos para S = P*(P-A)*(P-B)*(P-C): S = 8*(8-4)*(8-4)*(8-8) Simplificando: S = 8*4*4*0 = 0 S <= 0, logo: Não é Triângulo! Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 26 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2011 - -ES - Analista Judiciário - Análise de Banco de Dados Específicos Em uma estrutura de repetição com variável de controle, ou estrutura PARA, a verificação da condição é realizada antes da execução do corpo da sentença, o que impede a reescrita desse tipo de estrutura por meio de estrutura de repetição pós-testada. Comentários: Nós temos três tipos de estruturas de repetição com variável de controle: While/Enquanto, For/Para e Do-While/Faça-Enquanto - as duas primeiras prétestadas e a última pós-testada. De fato, a estrutura For/Para é pré-testada. No entanto, é possível reescrevê-la como uma Estrutura de Repetição Pós-Testada (DoWhile/Faça-Enquanto), de forma que elas sejam equivalentes. Gabarito: E (CESPE 0 – DETRAN/ES - Analista de Sistemas O método de recursividade deve ser utilizado para avaliar uma expressão aritmética na qual um procedimento pode chamar a si mesmo, ou seja, a recursividade consiste em um método que, para que possa ser aplicado a uma estrutura, aplica a si mesmo para as subestruturas componentes. Comentários: Por fim, vamos falar sobre recursividade! O que é isso, professor? Formalmente, é uma maneira de solucionar um problema por meio da instanciação de instâncias menores do mesmo problema. Grosso modo, a recursão é uma técnica em que uma função chama a si mesma. Eu gosto de pensar em recursividade por meio de imagens como as apresentadas abaixo. 16712855225
Conforme vimos em aula, está perfeito. Gabarito: C (CESPE - 2013 – RM - Analista de Sistemas Na implementação de recursividade, uma das soluções para que se evite o fenômeno de terminação do programa – que possibilita a ocorrência de um looping infinito – é definir uma função ou condição de terminação das repetições.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 27 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Comentários: Nós dissemos que se trata de uma função que chama a si mesma e, daí, temos o nosso primeiro problema. Se ela chama a si mesma sempre, não entra em um loop infinito? Sim, por isso é necessário um caso-base (solução trivial), i.e., um caso mais simples em que é utilizada uma condição de parada, que resolve o problema. Toda recursividade é composta por um caso base e pelas chamadas recursivas. Conforme vimos em aula, está perfeito novamente. Gabarito: C 10. (CESPE 4 – ANATEL - Analista de Sistemas A recursividade é uma técnica que pode ser utilizada na implementação de sistemas de lógica complexa, com a finalidade de minimizar riscos de ocorrência de defeitos no software. Comentários: Por fim, vamos falar sobre recursividade! O que é isso, professor? Formalmente, é uma maneira de solucionar um problema por meio da instanciação de instâncias menores do mesmo problema. Grosso modo, a recursão é uma técnica em que uma função chama a si mesma. Eu gosto de pensar em recursividade por meio de imagens como as apresentadas abaixo. Conforme vimos em aula, definitivamente essa não é uma finalidade da recursividade. Gabarito: E 16712855225
1 – TJ/ES - Analista de Sistemas Tanto a recursividade direta quanto 11. (CESPE a indireta necessitam de uma condição de saída ou de encerramento. Comentários: Por fim, gostaria de mencionar que existem dois tipos de recursividade: direta e indireta. De modo bem simples, a recursividade direta é aquela tradicional em que uma função chama a si mesma (Ex: Função A chama a Função A); a recursividade indireta é aquela alternativa em que uma função chama outra função que chama a primeira (Ex: Função A chama a Função B, que chama a Função A).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 28 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Conforme vimos em aula, existe recursividade direta e indireta, mas ambas precisam de um caso-base, que é uma condição de saída, para não ficar em loop infinito. Gabarito: C 12. (CONSULPLAN - 2012 - TSE - Programador de computador Observe o trecho de pseudocódigo.
A estrutura será executada até que X seja igual ao seguinte valor a) – 1 b) – 3 Comentários: Vamos lá: X = 13 No laço, ele afirma: X = X-2 X = 13-2 = 11 Segue esse loop novamente: X = 11-2 = 9 X = 9-2 = 7 X = 7-2 = 5 X = 5-2 = 3 X = 3-2 = 1 X = 1-2 = -1 X = -1-2 = -3 < -1, logo saímos do loop! 16712855225
Portanto, a estrutura é executada até X = -3. Gabarito: B 13. (CONSULPLAN - 2012 - TSE - Programador de computador Observe o trecho de pseudocódigo, que mostra o emprego da estrutura de controle enquanto ... faça ...
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 29 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
A opção que utiliza a estrutura para ... faça ... correspondente, que gera o mesmo resultado, é: a) Para n de 0 até 6 faça imprimir(n); b) Para n de 0 até 7 faça imprimir(n); Comentários: Vejamos: N = 0 e irá até N < 7, logo N de 0 a 6. Gabarito: A 14. (FEPESE - 2010 - SEFAZ-SC - Auditor Fiscal da Receita Estadual - Parte III Tecnologia da Informação Assinale a alternativa correta a respeito das variáveis e constantes, utilizadas em diversas linguagens de programação. a) O número de constantes deve ser menor ou igual ao número de variáveis em um programa. b) O número de constantes deve ser menor ou igual ao número de procedimentos em um programa. c) O número de constantes deve ser igual ao número de variáveis em um programa. d) O número de constantes independe da quantidade de variáveis em um programa. e) O número de constantes deve ser igual ao número de procedimentos em um programa. 16712855225
Comentários: Galera, não há essa relação! O número de constantes e variáveis são independentes. Gabarito: D
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 30 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
15. ( CEPE 5 – SEDUC/PI - Analista de Sistemas O código abaixo é usado para calcular o fatorial de números. Assinale a alternativa CORRETA sobre esse código: função fatorial(n) { se (n <= 1) retorne 1; senão retorne n * fatorial(n-1); }
a) Este é um exemplo de procedimento. b) O comando retorne pode ser retirado do código e a função terá o mesmo efeito. c) Exemplo clássico de recursividade. d) Não é possível chamar a função fatorial dentro dela mesma. e) O resultado da função sempre retornará um valor elevado a ele mesmo (valor ^ valor). Comentários: Em muitos casos, uma solução iterativa gasta menos memória e torna-se mais eficiente em termos de performance do que usar recursão. Galera, vocês se lembram que estudaram fatorial na escola? Pois é, fatorial é uma operação matemática em que um número natural (representado por n!) é o produto de todos os inteiros positivos menores ou iguais a n. 16712855225
Conforme vimos em aula, trata-se de um exemplo clássico de recursividade. Gabarito: C ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 31 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
FUNÇÕES E PROCEDIMENTOS Pessoal, é importante falarmos de alguns conceitos fundamentais! O que é uma rotina? Uma rotina nada mais é que um conjunto de instruções – um algoritmo. Uma sub-rotina (ou subprograma) é um pedaço menor desse conjunto de instruções que, em geral, será utilizado repetidamente em diferentes locais do sistema e que resolve um problema mais específico, parte do problema maior. Em vez de repetir um mesmo conjunto de instruções diversas vezes no código, esse conjunto pode ser agrupado em uma sub-rotina que é chamada em diferentes locais. As sub-rotinas podem vir por meio de uma função ou de um procedimento. A diferença fundamental é que, no primeiro caso, retorna-se um valor e no segundo caso, não. Entenderam? Galera, essa é a ideia geral! No entanto, algumas linguagens de programação têm funções e procedimentos em que nenhum retorna valor ou ambos retornam valor, ou seja, muitas vezes, sequer há uma distinção. No contexto da programação orientada a objetos, estas sub-rotinas são encapsuladas nos próprios objetos, ando a designar-se métodos. A criação de sub-rotinas foi histórica e permitiu fazer coisas fantásticas. Não fossem elas, estaríamos fazendo goto até hoje. Uma sub-rotina é um trecho de código marcado com um ponto de entrada e um ponto de saída. Entenderam? Quando uma sub-rotina é chamada, ocorre um desvio do programa para o ponto de entrada, e quando a subrotina atinge seu ponto de saída, o programa desaloca a sub-rotina, e volta para o mesmo ponto de onde tinha saído. Vejam a imagem ao lado! 16712855225
Algumas das vantagens na utilização de sub-rotinas durante a programação são: redução de código duplicado; possibilidade de reutilizar o mesmo código sem grandes alterações em outros programas; decomposição de problemas grandes em pequenas partes; melhorar a interpretação visual; esconder ou regular uma parte de um programa; reduzir o acoplamento; entre outros.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 32 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Quando uma sub-rotina termina, ela é desalocada das estruturas internas do programa, i.e., seu tempo de vida termina! É praticamente como se ela nunca tivesse existido. Podemos chamá-la de novo, isso é claro, mas será uma nova encarnação da sub-rotina: o programa novamente começará executando desde seu ponto de entrada. Uma co-rotina não funciona assim! As co-rotinas são parecidas com as sub-rotinas, diferindo apenas na forma de transferência de controle, realizada na chamada e no retorno. Elas possuem um ponto de entrada e podemos dizer que são mais genéricas que as sub-rotinas. Na co-rotina, o trecho de código trabalha conjuntamente com o código chamador até que sua tarefa seja terminada. O controle do programa é ado da co-rotina para o chamador e de volta para a co-rotina até que a tarefa da co-rotina termine. Numa co-rotina, existe o ponto de entrada (que é por onde se inicia o processamento), um ponto de saída (pela qual o tempo de vida da co-rotina termina), e um ponto de retorno parcial. Esse retorno parcial não termina com a vida da co-rotina. Pelo contrário, apenas a o controle do programa para a rotina chamadora, e marca um ponto de reentrada. Quando a rotina chamadora devolver o controle para a co-rotina, o processamento começa a partir do último ponto de retorno parcial. Na prática, uma co-rotina permite retornar valores diversas vezes antes de terminar o seu tempo de vida. Enquanto o tempo de vida das sub-rotinas é ditado pela pilha de execução, o tempo de vida das co-rotinas é ditado por seu uso e necessidade. 16712855225
Vamos falar agora um pouco sobre agem de parâmetros por valor e por referência. Vocês sabem que, quando o módulo principal chama uma função ou procedimento, ele a alguns valores chamados Argumentos de Entrada. Esse negócio costuma confundir muita gente, portanto vou explicar por meio de um exemplo, utilizando a função DobraValor(valor1, valor2) – apresentada na imagem abaixo: #include <stdio.h> void DobraValor(int valor1, int valor2) { valor1 = 2*valor1; valor2 = 2*valor2;
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 33 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 printf("Valores dentro da Função: \nValor 1 = %d\n Valor 2 = %d\n",valor1,valor2); } int main() { int valor1 = 5; int valor2 = 10; printf("Valores antes de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2); DobraValor(valor1,valor2); printf("Valores depois de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2); return(); }
Essa função recebe dois valores e simplesmente multiplica sua soma por dois. Então o que acontece se eu ar os parâmetros por valor para a função? Bem, ela receberá uma cópia das duas variáveis e, não, as variáveis originais. Logo, antes de a função ser chamada, os valores serão os valores iniciais: 5 e 10. Durante a chamada, ela multiplica os valores por dois, resultando em: 10 e 20. Valores Valor 1 Valor 2 Valores Valor 1 Valor 2 Valores Valor 1 Valor 2
antes de chamar a Função: = 5 = 10 dentro da Função: = 10 = 20 depois de chamar a Função: = 5 = 10
Após voltar para a função principal, os valores continuam sendo os valores iniciais: 5 e 10, como é apresentado acima na execução da função. Notem que os valores só se modificaram dentro da função DobraValor( ). Por que, professor? Ora, porque foi ada para função apenas uma cópia dos valores e eles que foram multiplicados por dois e, não, os valores originais. #include <stdio.h>
16712855225
void DobraValor(int *valor1, int *valor2) { *valor1 = 2*(*valor1); *valor2 = 2*(*valor2); printf("Valores dentro da Função: \nValor 1 = %d\n Valor 2 = %d\n", *valor1, *valor2); } int main() { int valor1 = 5; int valor2 = 10; printf("Valores antes de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2); DobraValor(&valor1,&valor2); printf("Valores depois de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2);
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 34 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 return(); }
Professor, o que ocorre na agem por referência? Bem, ela receberá uma referência para as duas variáveis originais e, não, cópias. Portanto, antes de a função ser chamada, os valores serão os valores iniciais: 5 e 10. Durante a chamada, ela multiplica os valores por dois, resultando em: 10 e 20. Após voltar para a função principal, os valores serão os valores modificados: 10 e 20. Valores Valor 1 Valor 2 Valores Valor 1 Valor 2 Valores Valor 1 Valor 2
antes de chamar a Função: = 5 = 10 dentro da Função: = 10 = 20 depois de chamar a Função: = 10 = 20
Notem que os valores se modificaram não só dentro da função DobraValor( ), como fora também (na função principal). Por que isso ocorreu, professor? Ora, porque foi ada para função uma referência para os valores originais e eles foram multiplicados por dois, voltando à função principal com os valores dobrados! Por isso, os valores 10 e 20. Resumindo: a agem de parâmetro por valor recebe uma cópia da variável original e qualquer alteração não refletirá no módulo principal. A agem de parâmetro por referência recebe uma referência para a própria variável e qualquer alteração refletirá no módulo principal. Em Java, por exemplo, a agem de parâmetros é sempre por valor! Bacana?
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 35 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
COMPLEXIDADE DE ALGORITMOS Galera, por que estudamos a complexidade de algoritmos? Para determinar o custo computacional (tempo, espaço, etc) para execução de algoritmos. Em outras palavras, ela classifica problemas computacionais de acordo com sua dificuldade inerente. É importante entender isso para posteriormente estudarmos a complexidade de métodos de ordenação e métodos de pesquisa. Nosso estudo aqui será bastante superficial por duas razões: primeiro, concursos cobram pouco e, quando cobram, querem saber as complexidades dos métodos de ordenação mais conhecidos; segundo, essa é uma disciplina absurdamente complexa que envolve Análise Assintótica, Cálculo Diferencial, Análise Polinomial (Linear, Exponencial, etc). Logo, vamos nos ater ao que cai em concurso público! Só uma pausa: ei dias sem dormir na minha graduação por conta dessa disciplina! Na UnB, ela era ministrada pelo Instituto de Matemática e era considerada a disciplina mais difícil do curso :-(. Continuando: lá em cima eu falei sobre custo computacional! Ora, para que eu escolha um algoritmo, eu preciso definir algum parâmetro. Podemos começar com Tempo! Um algoritmo que realiza uma tarefa em 20 minutos é melhor do que um algoritmo que realiza uma tarefa em 20 dias? Não é uma boa estratégia, porque depende do computador que eu estou utilizando (e todo o hardware correspondente), depende das otimizações realizadas pelo compilador, entre outras variáveis. Vamos analisar, então, Espaço! Um algoritmo que utiliza 20Mb de RAM é melhor do que um algoritmo que utiliza 20Gb? Seguem os mesmos argumentos utilizados para o Tempo, ou seja, não é uma boa opção! E agora, o que faremos? Galera, eu tenho uma sugestão: investigar a quantidade de vezes que operações são executadas na execução do algoritmo! 16712855225
Essa estratégia independe do computador (e hardware associado), do compilador, da linguagem de programação, das condições de implementação, entre outros fatores – ela depende apenas da qualidade inerente do algoritmo 3 implementado.
3
Pessoal, é claro que nossa visão sobre a complexidade dos algoritmos é teórica. Na prática, depende de diversos outros fatores, mas nosso foco é na visão analítica e, não, empírica.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 36 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Utilizam-se algumas simplificações matemáticas para se ter uma ideia do comportamento do algoritmo. Prosseguindo... Dada uma entrada de dados de tamanho N, podemos calcular o custo computacional de um algoritmo em seu pior caso, médio caso e melhor caso! Como assim, professor? Para entender isso, vamos utilizar a metáfora de um jogo de baralho! Imaginem que eu estou jogando contra vocês. Vocês embaralham e me entregam 5 cartas, eu embaralho novamente e lhes entrego 5 cartas. Quem joga baralho sabe que uma boa alternativa para grande parte dos jogos é ordenar as cartas em ordem crescente de modo a encontrar mais facilmente a melhor carta para jogar. Agora observem... vocês receberam as seguintes cartas (nessa ordem): 4, 5, 6, 7, 8. Já eu recebi as seguintes cartas (também nessa ordem): 8, 7, 6, 5, 4 – nós queremos analisar a complexidade de ordenação dessas cartas.
Ora, convenhamos que vocês possuem o melhor caso, porque vocês deram sorte de as cartas recebidas já estarem ordenadas. Já eu peguei o pior caso, porque as cartas estão ordenadas na ordem inversa. Por fim, o caso médio ocorre caso as cartas recebidas estejam em uma ordem aleatória. Com isso, espero que vocês tenham entendido o sentido de pior, médio e melhor casos. 16712855225
Vamos partir agora para o estudo da Notação Big-O (ou Notação Assintótica)! Isso é simplesmente uma forma de representar o comportamento assintótico de uma função. No nosso contexto, ela busca expressar a quantidade de operações primitivas executadas como função do tamanho da entrada de dados. Vamos ver isso melhor! A Notação Big-O é a representação relativa da complexidade de um algoritmo. É relativa porque só se pode comparar maçãs com maçãs, isto é, você não pode comparar um algoritmo de multiplicação aritmética com um algoritmo de ordenação de inteiros. É uma representação porque reduz a comparação entre algoritmos a uma simples variável por meio de observações e suposições.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 37 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
E trata da complexidade porque se é necessário 1 segundo para ordenar 10.000 elementos, quanto tempo levará para ordenar 1.000.000? A complexidade, nesse exemplo particular, é a medida relativa para alguma coisa. Vamos ver isso por meio de um exemplo: soma de dois inteiros! A soma é uma operação ou um problema e o método para resolver esse problema é chamado algoritmo!
Vamos supor que no algoritmo de somar (mostrado acima), a operação mais cara é a adição em si. Observem que se somarmos dois números de 100 dígitos, teremos que fazer 100 adições. Se somarmos dois números de 10.000 dígitos, teremos que fazer 10.000 adições. Perceberam o padrão? A complexidade (aqui, número de operações) é diretamente proporcional ao número n de dígitos, isto é, O(n). Quando dizemos que um algoritmo é O(n²), estamos querendo dizer que esse algoritmo é da ordem de grandeza quadrática! Ele basicamente serve para te dizer quão rápido uma função cresce, por exemplo: um algoritmo O(n) é melhor do que um algoritmo O(n²), porque ela cresce mais lentamente! Abaixo vemos uma lista das classes de funções mais comuns em ordem crescente de crescimento:
Notação O(1) O(log n) O[(log n)c] O(n) O(n log n) O(n²) O(n³) O(nc) O(cn) O(n!)
Prof. Diego Carvalho
16712855225
Nome Constante Logarítmica Polilogarítmica Linear – Quadrática Cúbica Polinomial Exponencial Fatorial
www.estrategiaconcursos.com.br
Pág. 38 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Quando dizemos que o Shellsort é um algoritmo O(n²), estamos querendo dizer que a complexidade (nesse caso, o número de operações) para ordenar um conjunto de n dados com o Algoritmo Shellsort é proporcional ao quadrado do número de elementos no conjunto! Grosso modo, para ordenar 20 números, é necessário realizar 400 operações (sem entrar em detalhes sobre a operação em si, nem sobre as simplificações matemáticas que são realizadas). Entender como se chega a esses valores para cada método de ordenação pesquisa é extremamente complexo! Galera, apesar de eu nunca ter visto isso em prova, é bom que vocês saibam que existem outras notações! Utiliza-se Notação Big-O (O) para pior caso; Notação Big-Ômega para melhor caso ( ); e Notação BigTheta ( ) para caso médio. Como, a prática, utiliza-se Big-O para tudo, o que eu recomendo (infelizmente, porque eu sei que vocês têm zilhões de coisas para decorar) é memorizar o pior caso dos principais métodos. Dessa forma, é possível responder a maioria das questões de prova sobre esse tema. Eventualmente, as questões pedem também caso médio e melhor caso, mas é menor comum. Bacana? :-)
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 39 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(VUNESP – 2012 – TJ/SP - Analista Judiciário - Tecnologia da Informação) Considerando o conceito de Complexidade de Algoritmos, representado por O(função), assinale a alternativa que apresenta, de forma crescente, as complexidades de algoritmos. a) O(2n); O(n3); O(n2); O(log2 n); O(n.log2 n). b) O(n2); O(n3); O(2n); O(log2 n); O(n.log2 n). c) O(n3); O(n2); O(2n); O(n.log2 n); O(log2 n). d) O(log2 n); O(n.log2 n); O(n2); O(n3); O(2n). e) O(n.log2 n); O(log2 n); O(2n); O(n3); O(n2). Comentários:
Notação O(1) O(log n) O[(log n)c] O(n) O(n log n) O(n²) O(n³) O(nc) O(cn) O(n!)
16712855225
Nome Constante Logarítmica Polilogarítmica Linear – Quadrática Cúbica Polinomial Exponencial Fatorial
Conforme vimos em aula, basta consultar a tabelinha! Gabarito: D (FCC - 2010 - TRT - 8ª Região (PA e AP) - Analista Judiciário - Tecnologia da Informação) Numa competição de programação, ganhava mais pontos o time que apresentasse o algoritmo mais eficiente para resolver o pior caso de um
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 40 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
determinado problema. A complexidade assintótica (notação Big O) dos algoritmos elaborados está ilustrada na tabela abaixo.
O time que obteve a medalha de prata (2º algoritmo mais eficiente) é o: a) Branco. b) Amarelo. c) Azul. d) Verde. e) Vermelho. Comentários:
Notação O(1) O(log n) O[(log n)c] O(n) O(n log n) O(n²) O(n³) O(nc) O(cn) O(n!)
16712855225
Nome Constante Logarítmica Polilogarítmica Linear – Quadrática Cúbica Polinomial Exponencial Fatorial
Conforme vimos em aula, basta consultar a tabelinha! O primeiro é o time Azul (O(1)) e o segundo é o time Amarelo (O(n log n)). Gabarito: B ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 41 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
MÉTODOS DE ORDENAÇÃO Métodos de Ordenação são algoritmos que têm o objetivo principal de posicionar os elementos de uma estrutura de dados em uma determinada ordem. Para que, professor? Ora, isso possibilita o o mais rápido e eficiente aos dados. Existem dezenas de métodos, todavia nessa aula veremos apenas os mais importantes: BubbleSort, QuickSort, InsertionSort, SelectionSort, MergeSort, ShellSort e HeapSort. Antes de iniciar, vamos falar sobre o conceito de Estabilidade! Um método estável é aquele em que os itens com chaves iguais mantêm-se com a posição inalterada durante o processo de ordenação, i.e., preserva-se a ordem relativa dos itens com chaves duplicadas ou iguais. Métodos Estáveis: Bubble, Insertion e Merge; Métodos Instáveis: Selection, Quick, Heap e Shell. Vejamos um exemplo:
16712855225
Na imagem acima, foi colocado um sinal de aspas simples e duplas apenas para diferenciá-los, mas trata-se do mesmo número. Um algoritmo estável ordena todo o restante e não perde tempo trocando as posições de elementos que possuam chaves idênticas. Já um algoritmo instável ordena todos os elementos, inclusive aqueles que possuem chaves idênticas (sob algum outro critério).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 42 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 BubbleSort (Troca)
Esse algoritmo é o primeiro método de ordenação aprendido na faculdade, porque ele é bastante simples e intuitivo. Nesse método, os elementos da lista são movidos para as posições adequadas de forma contínua. Se um elemento está inicialmente em uma posição i e, para que a lista fique ordenada, ele deve ocupar a posição j, então ele terá que ar por todas as posições entre i e j. Em cada iteração do método, percorremos a lista a partir de seu início comparando cada elemento com seu sucessor, trocandose de posição se houver necessidade. É possível mostrar que, se a lista tiver n elementos, após no máximo (n-1) iterações, a lista estará em ordem (crescente ou decrescente). Observem abaixo o código para a Ordenação em Bolha:
Melhor Caso O(n)
Prof. Diego Carvalho
Caso Médio O(n²) 16712855225
www.estrategiaconcursos.com.br
Pior Caso O(n²)
Pág. 43 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 InsertionSort (Inserção)
Esse algoritmo, também conhecido como Inserção Direta, é bastante simples apresenta um desempenho significativamente melhor que o BubbleSort, em termos absolutos. Além disso, ele é extremamente eficiente para listas que já estejam substancialmente ordenadas e listas com pequeno número de elementos. Observem abaixo o código para a Ordenação de Inserção:
Nesse método, consideramos que a lista está dividida em parte esquerda, já ordenada, e parte direita, em possível desordem. Inicialmente, a parte esquerda contém apenas o primeiro elemento da lista. Cada iteração consiste em inserir o primeiro elemento da parte direta (pivô) na posição adequada da parte esquerda, de modo que a parte esquerda continue ordenada. É fácil perceber que se a lista possui n elementos, após (n-1) inserções, ela estará ordenada. Para inserir o pivô, percorremos a parte esquerda, da direita para a esquerda, deslocando os elementos estritamente maiores que o pivô uma posição para direita. O pivô deve ser colocado imediatamente à esquerda do último elemento movido. 16712855225
Melhor Caso O(n)
Prof. Diego Carvalho
Caso Médio O(n²)
www.estrategiaconcursos.com.br
Pior Caso O(n²)
Pág. 44 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 SelectionSort (Seleção)
Esse algoritmo consiste em selecionar o menor elemento de um vetor e trocá-lo (swap) pelo item que estiver na primeira posição, i.e., inseri-lo no início do vetor. Essas duas operações são repetidas com os itens restantes até o último elemento. Tem como ponto forte o fato de que realiza poucas operações de swap. Seu desempenho costuma ser superior ao BubbleSort e inferior ao InsertionSort. Assim como no InsertionSort, considera-se que a lista está dividida em parte esquerda, já ordenada, e parte direita, em possível desordem. Ademais, os elementos da parte esquerda são todos menores ou iguais aos elementos da parte direita. Cada iteração consiste em selecionar o menor elemento da parte direita (pivô) e trocá- com o primeiro elemento da parte direita. Assim, a parte esquerda aumenta, visto que a a incluir o pivô, e a parte direita diminui. Note que o pivô é maior que todos os demais elementos da parte esquerda, portanto a parte esquerda continua ordenada. Ademais, o pivô era o menor elemento da direita, logo todos os elementos da esquerda continuam sendo menores ou iguais aos elementos da direita. Inicialmente, a parte esquerda é vazia.
16712855225
Melhor Caso O(n²)
Prof. Diego Carvalho
Caso Médio O(n²)
www.estrategiaconcursos.com.br
Pior Caso O(n²)
Pág. 45 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 QuickSort (Troca)
Esse algoritmo divide um conjunto de itens em conjuntos menores, que são ordenados de forma independente, e depois os resultados são combinados para produzir a solução de ordenação do conjunto maior. Trata-se, portanto, de um algoritmo do tipo Divisão-e-Conquista i.e., repartindo os dados em subgrupos, dependendo de um elemento chamado pivô. Talvez seja o método de ordenação mais utilizado! Isso ocorre porque quase sempre ele é significativamente mais rápido do que todos os demais métodos de ordenação baseados em comparação. Ademais, suas características fazem com que ele, assim como o MergeSort, possa ser facilmente paralelizado. Ele também pode ser adaptado para realizar ordenação externa (QuickSort Externo). Neste método, a lista é dividida em parte esquerda e parte direita, sendo que os elementos da parte esquerda são todos menores que os elementos da parte direita. Essa fase do processo é chamada de partição. Em seguida, as duas partes são ordenadas recursivamente (usando o próprio QuickSort). A lista está portanto ordenada corretamente! Uma estratégia para fazer a partição é escolher um valor como pivô e então colocar na parte esquerda os elementos menores ou iguais ao pivô e na parte direita os elementos maiores que o pivô – galera, a escolha do pivô é crítica! Em geral, utilizase como pivô o primeiro elemento da lista, a despeito de existirem maneiras de escolher “melhor” pivô. 16712855225
Esse algoritmo é um dos métodos mais rápidos de ordenação, apesar de às vezes partições desequilibradas poderem conduzir a uma ordenação lenta. A eficácia do método depende da escolha do pivô mais adequado ao conjunto de dados que se deseja ordenar. Alguns, por exemplo, utilizam a mediana de três elementos para otimizar o algoritmo. Alguns autores consideram a divisão em três subconjuntos, sendo o terceiro contendo valores iguais ao pivô. O Melhor Caso ocorre quando o conjunto é Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 46 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
dividido em subconjuntos de mesmo tamanho; o Pior Caso ocorre quando o pivô corresponde a um dos extremos (menor ou maior valor). Alguns o consideram um algoritmo frágil e não-estável, com baixa tolerância a erros.
Melhor Caso O(n log n)
Caso Médio O(n log n)
Pior Caso O(n²)
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 47 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 ShellSort (Inserção)
Esse algoritmo é uma extensão ou refinamento do algoritmo do InsertionSort, contornando o problema que ocorre quando o menor item de um vetor está na posição mais à direita. Ademais, difere desse último pelo fato de, em vez de considerar o vetor a ser ordenado como um único segmento, ele considera vários segmentos e aplica o InsertionSort em cada um deles. É o algoritmo mais eficiente dentre os de ordem quadrática. Nesse método, as comparações e as trocas são feitas conforme determinada distância (gap) entre dois elementos, de modo que, se gap = 6, há comparação entre o 1º e 7º elementos ou entre o 2º e 8º elementos e assim sucessivamente, repetindo até que as últimas comparações e trocas tenham sido efetuadas e o gap tenha chegado a 1.
Melhor Caso O(n log n)
Prof. Diego Carvalho
Caso Médio Depende do gap 16712855225
www.estrategiaconcursos.com.br
Pior Caso O(n²)
Pág. 48 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 MergeSort (Intercalação)
Esse algoritmo é baseado na estratégia de resolução de problemas conhecida como divisão-e-conquista. Essa técnica consiste basicamente em decompor a instância a ser resolvida em instâncias menores do mesmo tipo de problema, resolver tais instâncias (em geral, recursivamente) e por fim utilizar as soluções parciais para obter uma solução da instância original. Naturalmente, nem todo problema pode ser resolvido através de divisão e conquista. Para que seja viável aplicar essa técnica a um problema, ele deve possuir duas propriedades estruturais. O problema deve ser decomponível, i.e., deve ser possível decompor qualquer instância não trivial do problema em instâncias menores do mesmo tipo de problema. Além disso, deve ser sempre possível utilizar as soluções obtidas com a resolução das instâncias menores para chegar a uma solução da instância original. No MergeSort, divide-se a lista em duas metades. Essas metades são ordenadas recursivamente (usando o próprio MergeSort) e depois são intercaladas. Abaixo segue uma possível solução:
16712855225
Melhor Caso O(n log n)
Prof. Diego Carvalho
Caso Médio O(n log n)
www.estrategiaconcursos.com.br
Pior Caso O(n log n)
Pág. 49 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 HeapSort (Seleção)
Esse algoritmo utiliza uma estrutura de dados chamada heap, para ordenar os elementos à medida que os insere na estrutura. Assim, ao final das inserções, os elementos podem ser sucessivamente removidos da raiz da heap, na ordem desejada. Essa estrutura pode ser representada como uma árvore ou como um vetor. Entenderam? Inicialmente, insere-se os elementos da lista em um heap. Em seguida, fazemos sucessivas remoções do menor elemento do heap, colocando os elementos removidos do heap de volta na lista – a lista estará então em ordem crescente. O heapsort é um algoritmo de ordenação em que a quantidade de elementos armazenada fora do arranjo de entrada é constante durante toda a sua execução.
16712855225
Melhor Caso O(n log n)
Prof. Diego Carvalho
Caso Médio O(n log n)
www.estrategiaconcursos.com.br
Pior Caso O(n log n)
Pág. 50 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 RESUMÃO DE COMPLEXIDADES
ALGORITMO BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
MELHOR CASO O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
CASO MÉDIO O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
PIOR CASO O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 51 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(Instituto Cidades - 2012 - TCM-GO - Auditor de Controle Externo - Informática) São exemplos de algoritmos de ordenação, exceto: a) Bubble Sort b) Select Sort c) Shell Sort d) Busca Sequencial; e) Quick Sort; Comentários: Não, Busca Sequencial não é um algoritmo de ordenação! Na verdade, ele é um método de pesquisa sobre estruturas de dados. Gabarito: D (FUMARC - 2012 - -MG - Técnico Judiciário - Analista de Sistemas – I) Quicksort divide um conjunto de itens em conjuntos menores, que são ordenados de forma independe, e depois os resultados são combinados para produzir a solução de ordenação do conjunto maior. Comentários:
16712855225
Perfeito! Sendo um algoritmo do tipo Dividir Para Conquistar, ele reparte o conjunto de dados em conjuntos menores, que são ordenados independentemente e depois combinados em uma solução maior. Gabarito: C (CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6) O heapsort é um algoritmo de ordenação em que a quantidade de elementos armazenada fora do arranjo de entrada é constante durante toda a sua execução.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 52 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Comentários: Inicialmente, insere-se os elementos da lista em um heap. Em seguida, fazemos sucessivas remoções do menor elemento do heap, colocando os elementos removidos do heap de volta na lista – a lista estará então em ordem crescente. O heapsort é um algoritmo de ordenação em que a quantidade de elementos armazenada fora do arranjo de entrada é constante durante toda a sua execução. Conforme vimos em aula, está tudo perfeito! O jeito que a questão colocou ficou estranho, mas é o seguinte: você tem um arranjo de entrada (em geral, desordenado). A partir desse arranjo, você constrói um heap (em outro arranjo), mas que funciona como uma árvore. Então, pode-se dizer que ele funciona com dois arranjos, mas o segundo é apenas um heap auxiliar com um número constante de elementos. Gabarito: C (CESPE - 2010 - ABIN - Oficial Técnico de Inteligência - Área de e a Rede de Dados) A eficácia do método de ordenação rápida (quicksort) depende da escolha do pivô mais adequado ao conjunto de dados que se deseja ordenar. A situação ótima ocorre quando o pivô escolhido é igual ao valor máximo ou ao valor mínimo do conjunto de dados. Comentários: Alguns autores consideram a divisão em três subconjuntos, sendo o terceiro contendo valores iguais ao pivô. O Melhor Caso ocorre quando o conjunto é dividido em subconjuntos de mesmo tamanho; o Pior Caso ocorre quando o pivô corresponde a um dos extremos (menor ou maior valor). Alguns o consideram um algoritmo frágil e não-estável, com baixa tolerância a erros. 16712855225
Conforme vimos em aula, a questão se refere ao pior caso! Gabarito: E (CESPE - 2010 - ABIN - Oficial Técnico de Inteligência - Área de e a Rede de Dados) A estabilidade de um método de ordenação é importante quando o conjunto de dados já está parcialmente ordenado. Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 53 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Na imagem acima, foi colocado um sinal de aspas simples e duplas apenas para diferenciá-los, mas trata-se do mesmo número. Um algoritmo estável ordena todo o restante e não perde tempo trocando as posições de elementos que possuam chaves idênticas. Já um algoritmo instável ordena todos os elementos, inclusive aqueles que possuem chaves idênticas (sob algum outro critério). Conforme vimos em aula, a estabilidade é irrelevante com dados parcialmente ordenados ou não! A estabilidade é importante quando se deseja ordenar um conjunto de dados por mais de um critério (Ex: primeiro pelas chaves e segundo por índices). Se esse não for o caso (e a questão não disse que era!), a estabilidade “não fede nem cheira”. O fato de os dados estarem parcialmente ordenados não fará diferença em termos de ordenação – ambos serão ordenados da mesma maneira. Gabarito: E (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - istração de Dados A classificação interna por inserção é um método que realiza a ordenação de um vetor por meio da inserção de cada elemento em sua posição correta dentro de um subvetor classificado. Comentários: Perfeito, trata-se do InsertionSort! Gabarito: C (FCC - 2009 - TRT - 15ª Região - Analista Judiciário - Tecnologia da Informação) São algoritmos de classificação por trocas apenas os métodos: 16712855225
a) SelectionSort e InsertionSort. b) MergeSort e BubbleSort. c) QuickSort e SelectionSort. d) BubbleSort e QuickSort. e) InsertionSort e MergeSort. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 54 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
BubbleSort e QuickSort são métodos de troca; InsertionSort é um método de Inserção; SelectionSort e HeapSort são métodos de Seleção; e MergeSort é um método de Intercalação. Gabarito: D (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – I) O tempo de pior caso do algoritmo QuickSort é de ordem menor que o tempo médio do algoritmo Bubblesort. Comentários: Algoritmo BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
Melhor Caso O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
Caso Médio O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
Pior Caso O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
Portanto, está incorreto! São iguais: O(n²). Gabarito: E (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – II) O tempo médio do QuickSort é O(nlog2n), pois ele usa como estrutura básica uma árvore de prioridades. 16712855225
Comentários: Algoritmo BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
Prof. Diego Carvalho
Melhor Caso O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
Caso Médio O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
www.estrategiaconcursos.com.br
Pior Caso O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
Pág. 55 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
De fato, ele tem tempo médio O(n log n), mas ele usa como estrutura básica uma lista ou um vetor! Gabarito: E 10. (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – III) O tempo médio do QuickSort é de ordem igual ao tempo médio do MergeSort. Comentários: Algoritmo BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
Melhor Caso O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
Caso Médio O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
Pior Caso O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
Perfeito, ambos têm tempo O(n log n). Gabarito: C 11. (CESGRANRIO - 2012 - CMB – Analista de Sistemas – III) Em uma reunião de análise de desempenho de um sistema WEB, um programador apontou corretamente que a complexidade de tempo do algoritmo bubblesort, no pior caso, é: a) b) c) d) e)
O(1) O(log n) O(n) O(n log n) O(n2)
16712855225
Comentários: Algoritmo BubbleSort InsertionSort SelectionSort
Prof. Diego Carvalho
Melhor Caso O(n) O(n) O(n²)
Caso Médio O(n²) O(n²) O(n²)
www.estrategiaconcursos.com.br
Pior Caso O(n²) O(n²) O(n²)
Pág. 56 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
QuickSort ShellSort MergeSort HeapSort
O(n log n) O(n log n) O(n log n) O(n log n)
O(n log n) Depende do gap O(n log n) O(n log n)
O(n²) O(n²) O(n log n) O(n log n)
Trata-se de O(n²)! Gabarito: E 12. (CESPE - 2010 – INMETRO – Analista de Sistemas) Se f é uma função de complexidade para um algoritmo F, então O(f) é considerada a complexidade assintótica ou o comportamento assintótico do algoritmo F. Assinale a opção que apresenta somente algoritmos que possuem complexidade assintótica quando f(n) = O(n log n). a) b) c) d) e)
HeapSort e BubbleSort QuickSort e InsertionSort MergeSort e BubbleSort InsertionSort HeapSort, QuickSort e MergeSort
Comentários: Algoritmo BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
Melhor Caso O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
16712855225
Caso Médio O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
Pior Caso O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
Conforme vimos em aula, trata-se da última opção. Vejam que ele não utilizou, nessa questão, o Pior Caso. Gabarito: E 13. (FGV - 2013 – MPE/MS – Analista de Sistemas) Assinale a alternativa que indica o algoritmo de ordenação capaz de funcionar em tempo O(n) para alguns conjuntos de entrada.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 57 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
a) b) c) d) e)
Selectionsort (seleção) Insertionsort (inserção) Merge sort Quicksort Heapsort
Comentários: Algoritmo BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
Melhor Caso O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
Caso Médio O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
Pior Caso O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
Portanto, trata-se da segunda opção. Gabarito: B 14. (CESGRANRIO - 2010 – BACEN – Analista de Sistemas) Uma fábrica de software foi contratada para desenvolver um produto de análise de riscos. Em determinada funcionalidade desse software, é necessário realizar a ordenação de um conjunto formado por muitos números inteiros. Que algoritmo de ordenação oferece melhor complexidade de tempo (Big O notation) no pior caso? 16712855225
a) b) c) d) e)
Merge sort Insertion sort Bubble sort Quick sort Selection sort
Comentários: Algoritmo BubbleSort InsertionSort
Prof. Diego Carvalho
Melhor Caso O(n) O(n)
Caso Médio O(n²) O(n²)
www.estrategiaconcursos.com.br
Pior Caso O(n²) O(n²)
Pág. 58 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
SelectionSort QuickSort ShellSort MergeSort HeapSort
O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
O(n²) O(n²) O(n²) O(n log n) O(n log n)
Trata-se da primeira opção! Gabarito: A 15. (CESPE - 2011 – FUB – Analista de Sistemas) Os métodos de ordenação podem ser classificados como estáveis ou não estáveis. O método é estável se preserva a ordem relativa de dois valores idênticos. Alguns métodos eficientes como shellsort ou quicksort não são estáveis, enquanto alguns métodos pouco eficientes, como o método da bolha, são estáveis. Comentários: Métodos Estáveis: BubbleSort, InsertionSort e MergeSort; Métodos Instáveis: SelectionSort, QuickSort, HeapSort e ShellSort. Portanto, item perfeito! Gabarito: C 16. (CESPE - 2012 – BASA – Analista de Sistemas) O método de classificação Shellsort iguala-se ao método Quicksort em termos de complexidade temporal, porém é mais eficiente para quantidades pequenas a moderadas de dados. Comentários: 16712855225
Algoritmo BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
Melhor Caso O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
Caso Médio O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
Pior Caso O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
Não, a complexidade temporal é completamente diferente!
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 59 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Gabarito: E 17. (CESPE - 201 – BASA – Analista de Sistemas) O método de classificação Quicksort é estável e executado em tempo linearmente dependente da quantidade de dados que estão sendo classificados. Comentários: Algoritmo BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
Melhor Caso O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
Caso Médio O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
Pior Caso O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
QuickSort é instável e não possui complexidade temporal linear! Gabarito: E 18. (CESPE - 2012 – BASA – Analista de Sistemas) No método de ordenamento denominado shellsort, as comparações e as trocas são feitas conforme determinada distância entre dois elementos, de modo que, uma distância igual a 6 seria a comparação entre o primeiro elemento e o sétimo, ou entre o segundo elemento e o oitavo, e assim sucessivamente, repetindo-se esse processo até que as últimas comparações e trocas tenham sido efetuadas e a distância tenha diminuído até chegar a 1. 16712855225
Comentários: Perfeito, é exatamente assim! Gabarito: C 19. (FGV – PETROBRÁS – Analista de Sistemas) Sobre o algoritmo de ordenação heapsort, assinale a afirmação correta. a) Utiliza ordenação por árvore de decisão, ao invés de ordenação por comparação.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 60 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
b) A estrutura de dados que utiliza, chamada heap, pode ser interpretada como uma árvore binária. c) Seu desempenho de pior caso é pior do que o do algoritmo quicksort. d) Seu desempenho de pior caso é o mesmo da ordenação por inserção. e) Seu desempenho de pior caso é menor do que o da ordenação por intercalação. Comentários: (a) Utiliza ordenação por seleção; (b) Perfeito; (c) Não, é melhor que o QuickSort; (d) Não, é melhor que o InsertionSort; (e) Não, é idêntico ao MergeSort. Gabarito: B (CESGRANRIO – – BASA – Analista de Sistemas) Com relação aos algoritmos quicksort e mergsort, o tempo de execução para o: a) b) c) d) e)
pior caso do quicksort é (n lg n). pior caso do mergesort é (n2). pior caso do mergesort é (n lg n). caso médio do mergesort é O(lg n). caso médio do quicksort é O(n2).
Comentários: 16712855225
Algoritmo BubbleSort InsertionSort SelectionSort QuickSort ShellSort MergeSort HeapSort
Melhor Caso O(n) O(n) O(n²) O(n log n) O(n log n) O(n log n) O(n log n)
Caso Médio O(n²) O(n²) O(n²) O(n log n) Depende do gap O(n log n) O(n log n)
Pior Caso O(n²) O(n²) O(n²) O(n²) O(n²) O(n log n) O(n log n)
Trata-se da terceira opção.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 61 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Gabarito: C 21. (CESPE – 2009 – UNIPAMPA – Analista de Sistemas) O algoritmo quicksort, que divide uma instrução em quatro blocos diferentes de busca, é um exemplo de estrutura de ordenação de dados. Comentários: Não, são dois blocos diferentes de busca. Gabarito: E (CESPE - 2013 – RM – Analista de Sistemas) No algoritmo de ordenação denominado quicksort, escolhe-se um ponto de referência, denominado pivô, e separam-se os elementos em dois grupos: à esquerda, ficam os elementos menores que o pivô, e à direita ficam os maiores. Repete-se esse processo para os grupos de elementos formados (esquerda e direita) até que todos os elementos estejam ordenados. Comentários: Perfeito, é exatamente assim! Gabarito: C (CESPE - 2013 – MPU – Analista de Sistemas) Entre os algoritmos de ordenação e pesquisa bubble sort, quicksort e heapsort, o quicksort é considerado o mais eficiente, pois se caracteriza como um algoritmo de dividir-para-conquistar, utilizando operações de particionamento. 16712855225
Comentários: Não, o HeapSort é o mais eficiente no pior caso! Gabarito: E 24. (CESPE - 2013 – TRT/9 – Analista de Sistemas) No método Quicksort, o pivô é responsável pelo número de partições em que o vetor é dividido. Como o pivô não pode ser um elemento que esteja repetido no vetor, o Quicksort não funciona quando há elementos repetidos. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 62 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Comentários: O pivô não é responsável pelo número de partições em que o vetor é dividido. Ademais, ele pode sim ser um elemento que esteja repetido no vetor! Gabarito: E (FCC - 2011 - TRT - 14ª Região (RO e AC) - Analista Judiciário - Tecnologia da Informação) NÃO se trata de um método de ordenação (algoritmo): a) inserção direta. b) seleção direta. c) inserção por meio de incrementos decrescentes. d) direta em cadeias. e) particionamento. Comentários: (a) Trata-se do InsertionSort; (b) Trata-se do SelectionSort; (c) Trata-se do ShellSort; (d) Trata-se de um método de busca; (e) Trata-se do QuickSort. Portanto, é a quarta opção! Gabarito: D ACERTEI
ERREI
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 63 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) LÓGICA DE PROGRAMAÇÃO (FCC - 2010 -SP - Agente de Defensoria - Analista de Sistemas É utilizada para avaliar uma determinada expressão e definir se um bloco de código deve ou não ser executado. Essa é a definição da estrutura condicional: a) For b) If...Then...Else c) While d) Do...While e) Next (FCC 0 – TRT/SE - Analista de Sistemas Objeto que se constitui parcialmente ou é definido em termos de si próprio. Nesse contexto, um tipo especial de procedimento (algoritmo) será utilizado, algumas vezes, para a solução de alguns problemas. Esse procedimento é denominado: a) Recursividade. b) Rotatividade. c) Repetição. d) Interligação. e) Condicionalidade. (FCC – TJ/SE - Analista de Sistemas A recursividade na programação de computadores envolve a definição de uma função que: 16712855225
a) apresenta outra função como resultado. b) aponta para um objeto. c) aponta para uma variável. d) chama uma outra função. e) pode chamar a si mesma. (CESPE - 2011 - -ES - Técnico de Informática - Específicos Uma estrutura de repetição possibilita executar um bloco de comando, repetidas vezes, até que seja encontrada uma dada condição que conclua a repetição.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 64 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2010 - MPU - Analista de Informática - Desenvolvimento de Sistemas Se um trecho de algoritmo tiver de ser executado repetidamente e o número de repetições for indefinido, então é correto o uso, no início desse trecho, da estrutura de repetição Enquanto. (CESPE - 2013 - CNJ - Programador de computador) No fluxograma abaixo, se A = 4, B = 4 e C = 8, o resultado que será computado para Área é igual a 32.
(CESPE - 2011 - -ES - Analista Judiciário - Análise de Banco de Dados Específicos Em uma estrutura de repetição com variável de controle, ou estrutura PARA, a verificação da condição é realizada antes da execução do corpo da sentença, o que impede a reescrita desse tipo de estrutura por meio de estrutura de repetição pós-testada. 16712855225
(CESPE 0 – DETRAN/ES - Analista de Sistemas O método de recursividade deve ser utilizado para avaliar uma expressão aritmética na qual um procedimento pode chamar a si mesmo, ou seja, a recursividade consiste em um método que, para que possa ser aplicado a uma estrutura, aplica a si mesmo para as subestruturas componentes. (CESPE - 2013 – RM - Analista de Sistemas Na implementação de recursividade, uma das soluções para que se evite o fenômeno de terminação do programa – que possibilita a ocorrência de um looping infinito – é definir uma função ou condição de terminação das repetições.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 65 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
10. (CESPE 4 – ANATEL - Analista de Sistemas A recursividade é uma técnica que pode ser utilizada na implementação de sistemas de lógica complexa, com a finalidade de minimizar riscos de ocorrência de defeitos no software. 11. (CESPE 1 – TJ/ES - Analista de Sistemas Tanto a recursividade direta quanto a indireta necessitam de uma condição de saída ou de encerramento. 12. (CONSULPLAN - 2012 - TSE - Programador de computador Observe o trecho de pseudocódigo.
A estrutura será executada até que X seja igual ao seguinte valor a) – 1 b) – 3 13. (CONSULPLAN - 2012 - TSE - Programador de computador Observe o trecho de pseudocódigo, que mostra o emprego da estrutura de controle enquanto ... faça ...
A opção que utiliza a estrutura para ... faça ... correspondente, que gera o mesmo resultado, é: 16712855225
c) Para n de 0 até 6 faça imprimir(n); d) Para n de 0 até 7 faça imprimir(n); 14. (FEPESE - 2010 - SEFAZ-SC - Auditor Fiscal da Receita Estadual - Parte III Tecnologia da Informação Assinale a alternativa correta a respeito das variáveis e constantes, utilizadas em diversas linguagens de programação. a) O número de constantes deve ser menor ou igual ao número de variáveis em um programa.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 66 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
b) O número de constantes deve ser menor ou igual ao número de procedimentos em um programa. c) O número de constantes deve ser igual ao número de variáveis em um programa. d) O número de constantes independe da quantidade de variáveis em um programa. e) O número de constantes deve ser igual ao número de procedimentos em um programa. 15. (NUCEPE 5 – SEDUC/PI - Analista de Sistemas O código abaixo é usado para calcular o fatorial de números. Assinale a alternativa CORRETA sobre esse código: função fatorial(n) { se (n <= 1) retorne 1; senão retorne n * fatorial(n-1); }
a) Este é um exemplo de procedimento. b) O comando retorne pode ser retirado do código e a função terá o mesmo efeito. c) Exemplo clássico de recursividade. d) Não é possível chamar a função fatorial dentro dela mesma. e) O resultado da função sempre retornará um valor elevado a ele mesmo (valor ^ valor). 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 67 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) COMPLEXIDADE DE ALGORITMOS (VUNESP – 2012 – TJ/SP - Analista Judiciário - Tecnologia da Informação) Considerando o conceito de Complexidade de Algoritmos, representado por O(função), assinale a alternativa que apresenta, de forma crescente, as complexidades de algoritmos. a) O(2n); O(n3); O(n2); O(log2 n); O(n.log2 n). b) O(n2); O(n3); O(2n); O(log2 n); O(n.log2 n). c) O(n3); O(n2); O(2n); O(n.log2 n); O(log2 n). d) O(log2 n); O(n.log2 n); O(n2); O(n3); O(2n). e) O(n.log2 n); O(log2 n); O(2n); O(n3); O(n2). (FCC - 2010 - TRT - 8ª Região (PA e AP) - Analista Judiciário - Tecnologia da Informação Numa competição de programação, ganhava mais pontos o time que apresentasse o algoritmo mais eficiente para resolver o pior caso de um determinado problema. A complexidade assintótica (notação Big O) dos algoritmos elaborados está ilustrada na tabela abaixo.
O time que obteve a medalha de prata (2º algoritmo mais eficiente) é o: 16712855225
a) Branco. b) Amarelo. c) Azul. d) Verde. e) Vermelho.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 68 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) MÉTODOS DE ORDENAÇÃO (Instituto Cidades - 2012 - TCM-GO - Auditor de Controle Externo - Informática) São exemplos de algoritmos de ordenação, exceto: a) Bubble Sort b) Select Sort c) Shell Sort d) Busca Sequencial; e) Quick Sort; (FUMARC - 2012 - -MG - Técnico Judiciário - Analista de Sistemas – I) Quicksort divide um conjunto de itens em conjuntos menores, que são ordenados de forma independe, e depois os resultados são combinados para produzir a solução de ordenação do conjunto maior. (CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6) O heapsort é um algoritmo de ordenação em que a quantidade de elementos armazenada fora do arranjo de entrada é constante durante toda a sua execução. (CESPE - 2010 - ABIN - Oficial Técnico de Inteligência - Área de e a Rede de Dados) A eficácia do método de ordenação rápida (quicksort) depende da escolha do pivô mais adequado ao conjunto de dados que se deseja ordenar. A situação ótima ocorre quando o pivô escolhido é igual ao valor máximo ou ao valor mínimo do conjunto de dados. 16712855225
(CESPE - 2010 - ABIN - Oficial Técnico de Inteligência - Área de e a Rede de Dados) A estabilidade de um método de ordenação é importante quando o conjunto de dados já está parcialmente ordenado.
(CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - istração de Dados A classificação interna por inserção é um método que realiza a ordenação de um vetor por meio da inserção de cada elemento em sua posição correta dentro de um subvetor classificado.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 69 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(FCC - 2009 - TRT - 15ª Região - Analista Judiciário - Tecnologia da Informação) São algoritmos de classificação por trocas apenas os métodos: a) SelectionSort e InsertionSort. b) MergeSort e BubbleSort. c) QuickSort e SelectionSort. d) BubbleSort e QuickSort. e) InsertionSort e MergeSort. (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – I) O tempo de pior caso do algoritmo QuickSort é de ordem menor que o tempo médio do algoritmo Bubblesort. (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – II) O tempo médio do QuickSort é O(nlog2n), pois ele usa como estrutura básica uma árvore de prioridades. 10. (CESGRANRIO - 2011 - PETROBRÁS – Analista de Sistemas – III) O tempo médio do QuickSort é de ordem igual ao tempo médio do MergeSort. 11. (CESGRANRIO - 2012 - CMB – Analista de Sistemas – III) Em uma reunião de análise de desempenho de um sistema WEB, um programador apontou corretamente que a complexidade de tempo do algoritmo bubblesort, no pior caso, é: a) b) c) d) e)
O(1) O(log n) O(n) O(n log n) O(n2)
16712855225
12. (CESPE - 2010 – INMETRO – Analista de Sistemas) Se f é uma função de complexidade para um algoritmo F, então O(f) é considerada a complexidade assintótica ou o comportamento assintótico do algoritmo F. Assinale a opção que apresenta somente algoritmos que possuem complexidade assintótica quando f(n) = O(n log n). a) HeapSort e BubbleSort b) QuickSort e InsertionSort c) MergeSort e BubbleSort Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 70 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
d) InsertionSort e) HeapSort, QuickSort e MergeSort 13. (FGV - 2013 – MPE/MS – Analista de Sistemas) Assinale a alternativa que indica o algoritmo de ordenação capaz de funcionar em tempo O(n) para alguns conjuntos de entrada. a) b) c) d) e)
Selectionsort (seleção) Insertionsort (inserção) Merge sort Quicksort Heapsort
14. (CESGRANRIO - 10 – BACEN – Analista de Sistemas) Uma fábrica de software foi contratada para desenvolver um produto de análise de riscos. Em determinada funcionalidade desse software, é necessário realizar a ordenação de um conjunto formado por muitos números inteiros. Que algoritmo de ordenação oferece melhor complexidade de tempo (Big O notation) no pior caso? a) b) c) d) e)
Merge sort Insertion sort Bubble sort Quick sort Selection sort
15. (CESPE - 2011 – FUB – Analista de Sistemas) Os métodos de ordenação podem ser classificados como estáveis ou não estáveis. O método é estável se preserva a ordem relativa de dois valores idênticos. Alguns métodos eficientes como shellsort ou quicksort não são estáveis, enquanto alguns métodos pouco eficientes, como o método da bolha, são estáveis. 16712855225
16. (CESPE - 2012 – BASA – Analista de Sistemas) O método de classificação Shellsort iguala-se ao método Quicksort em termos de complexidade temporal, porém é mais eficiente para quantidades pequenas a moderadas de dados. 17. (CESPE - 2012 – BASA – Analista de Sistemas) O método de classificação Quicksort é estável e executado em tempo linearmente dependente da quantidade de dados que estão sendo classificados.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 71 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
18. (CESPE - 2012 – BASA – Analista de Sistemas) No método de ordenamento denominado shellsort, as comparações e as trocas são feitas conforme determinada distância entre dois elementos, de modo que, uma distância igual a 6 seria a comparação entre o primeiro elemento e o sétimo, ou entre o segundo elemento e o oitavo, e assim sucessivamente, repetindo-se esse processo até que as últimas comparações e trocas tenham sido efetuadas e a distância tenha diminuído até chegar a 1. 19. (FGV – PETROBRÁS – Analista de Sistemas) Sobre o algoritmo de ordenação heapsort, assinale a afirmação correta. a) Utiliza ordenação por árvore de decisão, ao invés de ordenação por comparação. b) A estrutura de dados que utiliza, chamada heap, pode ser interpretada como uma árvore binária. c) Seu desempenho de pior caso é pior do que o do algoritmo quicksort. d) Seu desempenho de pior caso é o mesmo da ordenação por inserção. e) Seu desempenho de pior caso é menor do que o da ordenação por intercalação. (CESGRANRIO – – BASA – Analista de Sistemas) Com relação aos algoritmos quicksort e mergsort, o tempo de execução para o: a) b) c) d) e)
pior caso do quicksort é (n lg n). pior caso do mergesort é (n2). pior caso do mergesort é (n lg n). caso médio do mergesort é O(lg n). caso médio do quicksort é O(n2). 16712855225
21. (CESPE – 2009 – UNIPAMPA – Analista de Sistemas) O algoritmo quicksort, que divide uma instrução em quatro blocos diferentes de busca, é um exemplo de estrutura de ordenação de dados. (CESPE - 2013 – RM – Analista de Sistemas) No algoritmo de ordenação denominado quicksort, escolhe-se um ponto de referência, denominado pivô, e separam-se os elementos em dois grupos: à esquerda, ficam os elementos Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 72 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
menores que o pivô, e à direita ficam os maiores. Repete-se esse processo para os grupos de elementos formados (esquerda e direita) até que todos os elementos estejam ordenados. (CESPE - 2013 – MPU – Analista de Sistemas) Entre os algoritmos de ordenação e pesquisa bubble sort, quicksort e heapsort, o quicksort é considerado o mais eficiente, pois se caracteriza como um algoritmo de dividir-para-conquistar, utilizando operações de particionamento. 24. (CESPE - 2013 – TRT/9 – Analista de Sistemas) No método Quicksort, o pivô é responsável pelo número de partições em que o vetor é dividido. Como o pivô não pode ser um elemento que esteja repetido no vetor, o Quicksort não funciona quando há elementos repetidos. (FCC - 2011 - TRT - 14ª Região (RO e AC) - Analista Judiciário - Tecnologia da Informação) NÃO se trata de um método de ordenação (algoritmo): a) inserção direta. b) seleção direta. c) inserção por meio de incrementos decrescentes. d) direta em cadeias. e) particionamento.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 73 de 74
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) LÓGICA DE PROGRAMAÇÃO 1 B 11 C
2 A 12 B
3 E 13 A
4 C 14 D
5 C 15 C
6 E 16
7 E 17
8 C 18
9 C 19
10 E 20
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) COMPLEXIDADE DE ALGORITMOS 1 D
2 B
3
4
5
6
7
8
9
10
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) MÉTODOS DE ORDENAÇÃO 1 D 11 E 21 E
2 C 12 E 22 C
3 C 13 B 23 E
Prof. Diego Carvalho
4 E 14 A 24 E
5 E 15 C 25 D
6 C 16 E 26
7 D 17 E 27
8 E 18 C 28
9 E 19 B 29
16712855225
www.estrategiaconcursos.com.br
Pág. 74 de 74
10 C 20 C 30
Aula 01 Desenvolvimento de Software para Concursos - Curso Regular Professor: Diego Carvalho
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
AULA 01
SUMÁRIO
PÁGINA 01 02 65 67 89
Apresentação - Estruturas de Dados - Estrutura de Arquivos Lista de Exercícios Comentados Gabarito
Lógica de Programação. Tipos de Dados. Operadores e Expressões. Estruturas de Controle, Seleção, Repetição e Desvio. Recursividade. Funções e Procedimentos. Complexidade de Algoritmos. Métodos de Ordenação. BubbleSort, InsertionSort, SelectionSort, QuickSort, ShellSort, MergeSort e HeapSort. Estruturas de Dados. Vetores e Matrizes. Lista Encadeada. Pilhas. Filas. Árvore. Grafos. Hashing. Estrutura de Arquivos. Padrões de Projeto GOF. Padrões de Projeto Java EE. Padrões de Projeto GRASP. Java SE. Conceitos Básicos. Plataforma Java. Compilação e Interpretação. agem por Valor e Referência. Empacotamento. Raiz. Identificadores. Blocos e Comandos. Comentários. Palavras Reservadas. Tipos Primitivos. Operadores. Vetores. Conversão de Tipos. Controle de Fluxos. Classes. Objetos. Atributos. Métodos. Herança. Encapsulamento. Interface. Polimorfismo. Interface Gráfica. Tipos Enumerados. Anotações. Classes Internas. Reflexão e Genéricos. Tratamento de Exceções. Sincronismo e Multithreading. Coleções. Streams e Serialização. Classes e Operações de I/O. Novidades Java 8. Arquitetura Java EE. JSP. Servlets. JSF. JPA. Hibernate. JDBC. JVM. Spring. Struts. JMS. JNDI. JTA. JSTL. HTML e CSS. JavaScript. JQuery. AJAX. DHTML. XHTML. XML. XSLT. XSD. Sistemas Móveis. Android. iOS. Segurança no Desenvolvimento. Compiladores e Interpretadores. Ferramentas de Controle de Versão. SVN. CVS. Git. Análise Estática de Código-Fonte. SonarQube. Integração Contínua (e outros) Framework .NET, C#, Visual Basic, ASP.NET e Visual Studio (Prof. Mayara Rosa) Delphi e PHP (Prof. Mayara Rosa).
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 1 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
ESTRUTURAS DE DADOS Pessoal, um programa pode ser visto como uma especificação formal da solução de um problema. Wirth expressa esse conceito por meio de uma equação:
PROGRAMA = ALGORITMO + ESTRUTURA DE DADOS
Nosso foco aqui é em Estruturas de Dados! Na evolução do mundo computacional, um fator extremamente importante trata da forma de armazenar informações. De nada adianta o enorme desenvolvimento de hardware e software se a forma de armazenamento e tratamento de dados não evoluir harmonicamente. E é por isso que as estruturas de dados são tão fundamentais. As estruturas de dados, na maioria dos casos, baseiam-se nos tipos de armazenamento vistos dia a dia, i.e., nada mais são do que a transformação de uma forma de armazenamento já conhecida e utilizada no mundo real adaptada para o mundo computacional. Por isso, cada tipo de estrutura de dados possui vantagens e desvantagens e cada uma tem sua área de atuação otimizada. Bem, não vou enrolar muito explicando o que é uma Estrutura de Dados! A melhor forma de saber é vendo exemplos. Antes disso, eu gostaria de falar sobre um conceito importante: Dados Homogêneos e Heterogêneos. Os primeiros são aqueles que possuem só um tipo básico de dados (Ex: Inteiros); os segundos são aqueles que possuem mais de um tipo básico de dados (Ex: Inteiros + Caracteres). 16712855225
Entenderam? Existem estruturas de dados que tratam de dados homogêneos, i.e., todos os dados são apenas de um tipo básico, tais como Vetores! Ora, em um vetor, todos os elementos são do mesmo tipo. Existem estruturas de dados que tratam de dados heterogêneos, i.e., os dados são de tipos básicos diferentes, tais como Listas! Ora, em uma lista, todos os elementos são, em geral, de tipos básicos diferentes. Além dessa classificação, existe outra também importante: Estruturas Lineares e Estruturas Não-Lineares. As Estruturas Lineares são aquelas em que cada elemento pode ter um único predecessor (exceto o primeiro elemento) e um único sucessor
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 2 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(exceto o último elemento). Como exemplo, podemos citar Listas, Pilhas, Filas, Arranjos, entre outros. Já as Estruturas Não-Lineares são aquelas em que cada elemento pode ter mais de um predecessor e/ou mais de um sucessor. Como exemplo, podemos citar Árvores, Grafos e Tabelas de Dispersão. Essa é uma classificação muito importante e muito simples de entender. Pessoal, vocês perceberão que esse assunto é cobrado de maneira superficial na maioria das questões, mas algumas são nível doutorado! Por fim, vamos falar sobre Tipos Abstratos de Dados (TAD). Podemos defini-lo como um modelo matemático (v,o), em que v é um conjunto de valores e o é um conjunto de operações que podem ser realizadas sobre valores. Eu sei, essa definição é horrível de entender! Para compreender esse conceito, basta lembrar de abstração, i.e., apresentar interfaces e esconder detalhes. Os Tipos Abstratos de Dados são simplesmente um modelo para um certo tipo de estrutura de dados. Como assim, professor? Quando eu falo em pilha, eu estou falando de um tipo abstrato de dados que tem duas operações com comportamentos bem definidos e conhecidos: push (para inserir elementos na pilha); e pop (para retirar elementos da pilha). E a implementação dessas operações? Isso não importa! Aliás, não importa implementação nem paradigma nem linguagem de programação. Não importa se a pilha é implementada com um paradigma orientado a objetos ou com um paradigma estruturado; não importa se a pilha é implementada em Java ou Pascal; não importa como é a implementação interna – isso serve para outras estruturas1. Podemos concluir, portanto, que um tipo abstrato de dados contém um modelo que contém valores e operações associadas, de forma que essas operações sejam precisamente independentes de uma implementação particular. Em geral, um TDA é especificado por meio de uma especificação algébrica que, em geral, contém três partes: Especificação Sintática, Semântica e de Restrições. 16712855225
A Especificação Sintática define o nome do tipo, suas operações e o tipo dos argumentos das operações, definindo a do TAD. A Especificação Semântica descreve propriedades e efeitos das operações de forma independente de uma implementação específica. E a Especificação de Restrições estabelece as condições que devem ser satisfeitas antes e depois da aplicação das operações. 1
Filas, Pilhas, Árvores, Deques, entre outros.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 3 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Em outras palavras, o nível semântico trata do comportamento de um tipo abstrato de dados; e o nível sintático trata da apresentação de um tipo abstrato de dados. Podemos dizer, então, que o TAD encapsula uma estrutura de dados com características semelhantes – podendo ser formado por outros TADs –, e esconde a efetiva implementação dessa estrutura de quem a manipula.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 4 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(FGV – 2015 – DPE/ – Analista de Sistemas) No desenvolvimento de sistemas, a escolha de estruturas de dados em memória é especialmente relevante. Dentre outras classificações, é possível agrupar essas estruturas em lineares e não lineares, conforme a quantidade de sucessores e antecessores que os elementos da estrutura possam ter. Assinale a opção que apresenta, respectivamente, estruturas de dados lineares e não lineares. a) Tabela de dispersão e fila. b) Estrutura de seleção e pilha. c) Pilha e estrutura de seleção. d) Pilha e árvore binária de busca. e) Fila e pilha. Comentários: Além dessa classificação, existe outra também importante: Estruturas Lineares e Estruturas Não-Lineares. As Estruturas Lineares são aquelas em que cada elemento pode ter um único predecessor (exceto o primeiro elemento) e um único sucessor (exceto o último elemento). Como exemplo, podemos citar Listas, Pilhas, Filas, Arranjos, entre outros. Já as Estruturas Não-Lineares são aquelas em que cada elemento pode ter mais de um predecessor e/ou mais de um sucessor. Como exemplo, podemos citar Árvores, Grafos e Tabelas de Dispersão. Essa é uma classificação muito importante e muito simples de entender. Pessoal, vocês perceberão que esse assunto é cobrado de maneira superficial na maioria das questões, mas algumas são nível doutorado! 16712855225
Conforme vimos em aula, trata-se de pilha e árvore respectivamente. Gabarito: D (CESPE – 2010 – DETRAN/ES – Analista de Sistemas) Um tipo abstrato de dados apresenta uma parte destinada à implementação e outra à especificação. Na primeira, são descritas, em forma sintática e semântica, as operações que podem Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 5 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
ser realizadas; na segunda, os objetos e as operações são representados por meio de representação, operação e inicialização. Comentários: A Especificação Sintática define o nome do tipo, suas operações e o tipo dos argumentos das operações, definindo a do TAD. A Especificação Semântica descreve propriedades e efeitos das operações de forma independente de uma implementação específica. E a Especificação de Restrições estabelece as condições que devem ser satisfeitas antes e depois da aplicação das operações. Conforme vimos em aula, as especificações semântica e sintática são tratadas na parte de especificação. Gabarito: E (CESPE – 2010 – TRT/RN – Analista de Sistemas) O tipo abstrato de dados consiste em um modelo matemático (v,o), em que v é um conjunto de valores e o é um conjunto de operações que podem ser realizadas sobre valores. Comentários: Por fim, vamos falar sobre Tipos Abstratos de Dados (TAD). Podemos defini-lo como um modelo matemático (v,o), em que v é um conjunto de valores e o é um conjunto de operações que podem ser realizadas sobre valores. Eu sei, essa definição é horrível de entender! Para compreender esse conceito, basta lembrar de abstração, i.e., apresentar interfaces e esconder detalhes. Conforme vimos em aula, a questão está perfeita. 16712855225
Gabarito: C (CESPE – 2010 – BASA – Analista de Sistemas) A escolha de estruturas internas de dados utilizados por um programa pode ser organizada a partir de TADs que definem classes de objetos com características distintas. Comentários: Em outras palavras, o nível semântico trata do comportamento de um tipo abstrato de dados; e o nível sintático trata da apresentação de um tipo abstrato de dados. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 6 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
demos dizer, então, que o TAD encapsula uma estrutura de dados com características semelhantes – podendo ser formado por outros TADs –, e esconde a efetiva implementação dessa estrutura de quem a manipula. Conforme vimos em aula, definem classes de objetos com características semelhantes. Gabarito: E (CESPE – 2010 – BASA – Analista de Sistemas) A descrição dos parâmetros das operações e os efeitos da ativação das operações representam, respectivamente, os níveis sintático e semântico em que ocorre a especificação dos TDAs. Comentários: A Especificação Sintática define o nome do tipo, suas operações e o tipo dos argumentos das operações, definindo a do TAD. A Especificação Semântica descreve propriedades e efeitos das operações de forma independente de uma implementação específica. E a Especificação de Restrições estabelece as condições que devem ser satisfeitas antes e depois da aplicação das operações. Conforme vimos em aula, a questão está perfeita. Gabarito: C (FCC – 2010 – TRE/AM – Analista de Sistemas) Em relação aos tipos abstratos de dados - TAD, é correto afirmar: a) O TAD não encapsula a estrutura de dados para permitir que os usuários possam ter o a todas as operações sobre esses dados. 16712855225
b) Na transferência de dados de uma pilha para outra, não é necessário saber como a pilha é efetivamente implementada. c) Alterações na implementação de um TAD implicam em alterações em seu uso. d) Um programador pode alterar os dados armazenados, mesmo que não tenha conhecimento de sua implementação.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 7 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
e) TAD é um tipo de dados que esconde a sua implementação de quem o manipula. Comentários: Em outras palavras, o nível semântico trata do comportamento de um tipo abstrato de dados; e o nível sintático trata da apresentação de um tipo abstrato de dados. Podemos dizer, então, que o TAD encapsula uma estrutura de dados com características semelhantes – podendo ser formado por outros TADs –, e esconde a efetiva implementação dessa estrutura de quem a manipula. (a) Errado, ele encapsula a estrutura de dados; (b) Correto, não é necessário saber a implementação, porém a FCC marcou o gabarito como errado; (c) Errado, a implementação pode mudar livremente; (d) Errado, sem conhecimento da implementação, ele não poderá alterar dados armazenados; (e) Correto, esse item também está correto (Lembrem-se: Na FCC, muitas vezes tempos que marcar a mais correta ou a menos errada – infelizmente!). Gabarito: C (FCC – – TRE/PI – Analista de Sistemas) Em relação a tipos abstratos de dados, é correto afirmar que: a) o TAD não encapsula a estrutura de dados para permitir que os usuários possam ter o a todas as operações disponibilizadas sobre esses dados. b) algumas pilhas item serem declaradas como tipos abstratos de dados. c) filas não permitem declaração como tipos abstratos de dados. 16712855225
d) os tipos abstratos de dados podem ser formados pela união de tipos de dados primitivos, mas não por outros tipos abstratos de dados. e) são tipos de dados que escondem a sua implementação de quem o manipula; de maneira geral as operações sobre estes dados são executadas sem que se saiba como isso é feito. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 8 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Em outras palavras, o nível semântico trata do comportamento de um tipo abstrato de dados; e o nível sintático trata da apresentação de um tipo abstrato de dados. Podemos dizer, então, que o TAD encapsula uma estrutura de dados com características semelhantes – podendo ser formado por outros TADs –, e esconde a efetiva implementação dessa estrutura de quem a manipula. (a) Errado. Pelo contrário, ele encapsula a estrutura de dados de modo que o usuário não tem o a implementação das operações; (b) Correto. Todas elas item, porém a FCC marcou o gabarito como errado; (c) Errado. Elas permitem a declaração como tipos abstratos de dados; (d) Errado. Um TAD pode ser formado por outros TADs; (e) Correto. Escondem a implementação de quem os manipula. Gabarito: E ACERTEI
ERREI
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 9 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 VETORES E MATRIZES
Um Vetor é uma estrutura de dados linear que necessita de somente um índice para que seus elementos sejam indexados. É uma estrutura homogênea, portanto armazena somente uma lista de valores do mesmo tipo. Ele possui alocação estática, com dados armazenados em posições contíguas de memória e permite o o direto ou aleatório a seus elementos. Observem que, diferentemente das listas, filas e pilhas, ele vem praticamente embutido em qualquer linguagem de programação. E a Matriz, professor? Não muda muita coisa! Trata-se de um arranjo bidimensional ou multidimensional de alocação estática e sequencial. Ela necessita de um índice para referenciar a linha e outro para referenciar a coluna para que seus elementos sejam endereçados. Da mesma forma que um vetor, uma matriz é definida com um tamanho fixo, todos os elementos são do mesmo tipo, cada célula contém somente um valor e os tamanhos dos valores são os mesmos. Os elementos ocupam posições contíguas na memória. A alocação dos elementos pode ser feita colocando os elementos linha-por-linha ou coluna-por-coluna.
16712855225
MATRIZ 2X7 E VETOR (7 POSIÇÕES)
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 10 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(FCC - 2009 - -PA - Analista Judiciário - Tecnologia da Informação Considere uma estrutura de dados do tipo vetor. Com respeito a tal estrutura, é correto que seus componentes são, característicamente, a) heterogêneos e com o FIFO. b) heterogêneos e com o LIFO. c) heterogêneos e com o indexado-sequencial. d) homogêneos e o não indexado. e) homogêneos e de o aleatório por intermédio de índices. Comentários: Vetores possuem componentes homogêneos, i.e., todos os dados são de apenas um único tipo básico de dados. Ademais, seu o é aleatório por meio de índices! Bem, seria mais correto dizer que seu o é direto. Gabarito: E (CETAP - 2010 - - - Analista de Sistemas Matrizes são estruturas de dados de n-dimensões. Por simplicidade, chamaremos de matrizes as matrizes bidimensionais numéricas (que armazenam números inteiros). Sendo assim, marque a alternativa INCORRETA. 16712855225
a) Uma matriz de m linhas e n colunas contêm (m * n) dados. b) Uma matriz pode ser representada utilizando listas ligadas. c) A soma dos elementos de uma matriz pode ser calculada fazendo dois laços aninhados, um sobre as linhas e o outro sobre as colunas. d) A soma de duas matrizes de m linhas e n colunas resulta em uma matriz de 2*m linhas e 2*n colunas.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 11 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
e) O produto de duas matrizes de n linhas e n colunas resulta em uma matriz de n linhas e n colunas. Comentários: (a) Perfeito, são M x N colunas; (b) Perfeito, podem ser utilizadas listas ligadas; (c) Perfeito, um laço para as linhas e outro para as colunas; (d) Não, a soma de uma Matriz 3x5 com outra Matriz 3x5 resulta em uma Matriz 3x5; (e) Perfeito, uma Matriz 2x2 multiplicada por outra Matriz 2x2 resulta em uma Matriz 2x2. Gabarito: D (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Arquitetura de Tecnologia Os dados armazenados em uma estrutura do tipo matriz não podem ser ados de maneira aleatória. Portanto, usa-se normalmente uma matriz quando o volume de inserção e remoção de dados é maior que o volume de leitura dos elementos armazenados. Comentários: Podem, sim, ser ados de maneira aleatória ou direta, por meio de seus índices. Ademais, usa-se normalmente uma matriz quando o volume de leitura de elementos armazenados é maior que o volume de inserção e remoção de dados. Ora, é possível fazer o direto, logo é eficiente mesmo com alto volume de leitura. Gabarito: E (CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação Entre alguns tipos de estrutura de dados, podem ser citados os vetores, as pilhas e as filas. 16712855225
Comentários: Perfeito! Questão extremamente simples. Gabarito: C
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 12 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2011 - EBC - Analista - Engenharia de Software Vetores são utilizados quando estruturas indexadas necessitam de mais que um índice para identificar um de seus elementos. Comentários: Não! Se são necessários mais de um índice, utilizam-se Matrizes! Vetores necessitam apenas de um índice. Gabarito: E (CESPE - 2010 - TRE-BA - Analista Judiciário - Análise de Sistemas) Vetores podem ser considerados como listas de informações armazenadas em posição contígua na memória. Comentários: Perfeito! Vetores podem ser considerados como listas de informações? Sim! As informações (dados) são armazenadas em posição contígua na memória? Sim, em geral são armazenados de forma contígua. Gabarito: C (CESPE - 2010 - TRE-BA - Analista Judiciário - Análise de Sistemas Uma posição específica de um vetor pode ser ada diretamente por meio de seu índice. Comentários: Perfeito! Observem que vetores são diferentes de listas, nesse sentido. Eu posso ar qualquer elemento diretamente por meio de seu índice. 16712855225
Gabarito: C ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 13 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 LISTA ENCADEADA
Também conhecida como Lista Encadeada Linear, Lista Ligada Linear ou Linked List, trata-se de uma estrutura de dados dinâmica formada por uma sequência encadeada de elementos chamados nós, que contêm dois campos: campo de informação e campo de endereço. O primeiro armazena o real elemento da lista e o segundo contém o endereço do próximo nó da lista. Esse endereço, que é usado para ar determinado nó, é conhecido como ponteiro. A lista ligada inteira é ada a partir de um ponteiro externo que aponta para o primeiro nó na lista, i.e., contém o endereço do primeiro nó 2. Por ponteiro "externo", entendemos aquele que não está incluído dentro de um nó. Em vez disso, seu valor pode ser ado diretamente, por referência a uma variável. O campo do próximo endereço do último nó na lista contém um valor especial, conhecido como NULL, que não é um endereço válido. Esse ponteiro nulo é usado para indicar o final de uma lista. Uma lista é chamada Lista Vazia ou Lista Nula caso não tenha nós ou tenha apenas um nó sentinela. O valor do ponteiro externo para esta lista é o ponteiro nulo. Uma lista pode ser inicializada com uma lista vazia.
16712855225
Suponha que seja feita uma mudança na estrutura de uma lista linear, de modo que o campo próximo no último nó contenha um ponteiro de volta para o primeiro nó, em vez de um ponteiro nulo. Esse tipo de lista é chamado Lista Circular (ou
2
O endereço do primeiro nó pode ser encapsulado para facilitar possíveis futuras operações sobre a lista sem a necessidade de se conhecer sua estrutura interna. O primeiro elemento e o último nós são muitas vezes chamados de Sentinela.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 14 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Fechada3), i.e., a partir de qualquer ponto, é possível atingir qualquer outro ponto da lista. Certinho, até agora?
Observe que uma Lista Circular não tem um primeiro ou último nó natural. Precisamos, portanto, estabelecer um primeiro e um último nó por convenção. Uma convenção útil é permitir que o ponteiro externo para a lista circular aponte para o último nó, e que o nó seguinte se torne o primeiro nó. Assim podemos incluir ou remover um elemento convenientemente a partir do início ou do final de uma lista.
16712855225
Embora uma lista circularmente ligada tenha vantagens sobre uma lista linear, ela ainda apresenta várias deficiências. Não se pode atravessar uma lista desse tipo no sentido contrário nem um nó pode ser eliminado de uma lista circularmente ligada sem se ter um ponteiro para o nó antecessor. Nos casos em que tais recursos são necessários, a estrutura de dados adequada é uma lista duplamente ligada. 3
Se Listas Circulares são conhecidas como Listas Fechadas, as Listas Abertas são todas aquelas que são NãoCirculares. Por fim: da mesma forma que há Listas Circulares Simples, há também Listas Circulares Duplas. Nesse caso, o ponteiro anterior do primeiro elemento aponta para o último elemento e o ponteiro posterior do último elemento aponta para o primeiro elemento.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 15 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Cada nó numa lista desse tipo contém dois ponteiros, um para seu predecessor e outro para seu sucessor. Na realidade, no contexto de listas duplamente ligadas, os termos predecessor e sucessor não fazem sentido porque a lista é totalmente simétrica. As listas duplamente ligadas podem ser lineares ou circulares e podem conter ou não um nó de cabeçalho. Podemos considerar os nós numa lista duplamente ligada como consistindo em três campos: um campo info que contém as informações armazenadas no nó, e os campos left e right, que contêm ponteiros para os nós em ambos os lados. Dado ponteiro para um elemento, pode-se ar os elementos adjacentes e, dado um ponteiro para o último elemento, pode-se percorrer a lista em ordem inversa. Existem cinco operações básicas sobre uma lista encadeada: Criação, em que se cria a lista na memória; Busca, em que se pesquisa nós na lista; Inclusão, em que se insere novos nós na lista em uma determinada posição; Remoção, em que se elimina um elemento da lista; e, por fim, Destruição, em que se destrói a lista junto com todos os seus nós.
IMPORTANTE Pilhas e Filas são subespécies de Listas. No entanto, cuidado na hora de responder questões! De maneira genérica, Pilhas e Filas podem ser implementadas como Listas. No entanto, elas possuem características particulares de uma lista genérica. Ok? Precisamos falar um pouco sobre Fragmentação! O que é isso, professor? Galera, falou em fragmentação, lembrem-se de desperdício de espaço disponível de memória. O fenômeno no qual existem vários blocos disponíveis pequenos e nãocontíguos é chamado fragmentação externa porque o espaço disponível é desperdiçado fora dos blocos alocados. 16712855225
Esse fenômeno é o oposto da fragmentação interna, no qual o espaço disponível é desperdiçado dentro dos blocos alocados, como apresenta a imagem abaixo. Sistemas Operacionais possuem uma estrutura de dados que armazena informações sobre áreas ou blocos livres (geralmente uma lista ou tabela). Uma lista encadeada elimina o problema da fragmentação externa. Por que? Porque mantém os arquivos, cada um, como uma lista encadeada de blocos de disco. Dessa forma, uma parte de cada bloco é usada como ponteiro para o próximo Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 16 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
bloco e o restante do bloco é usado para dados. Uma vantagem desse tipo de alocação é que o tamanho do arquivo não precisa ser conhecido antes de sua criação, já que cada bloco terá um ponteiro para o próximo bloco.
Galera... e o o a uma lista? Lista é uma estrutura de o sequencial, i.e., é preciso percorrer por nó para ar um dado específico. Logo, é proporcional ao número de elementos – o O(n). E os Vetores? Eles são uma estrutura de o direto, i.e., pode-se ar um elemento diretamente. Portanto, não precisa percorrer elemento por elemento (o O(1)) 4. 16712855225
4
No o Sequencial: quanto mais ao fim, maior o tempo para ar; no o Direto: todos os elementos são ados no mesmo tempo.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 17 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) O tempo de busca de um elemento em uma lista duplamente encadeada é igual à metade do tempo da busca de um elemento em uma lista simplesmente encadeada. Comentários: Não! Apesar de permitir que se percorra a lista em ambas as direções, em média ambas possuem o mesmo tempo de busca de um elemento. Gabarito: E (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) Em algumas implementações, uma lista vazia pode ter um único nó, chamado de sentinela, nó cabeça ou header. Entre suas possíveis funções, incluise simplificar a implementação de algumas operações realizadas sobre a lista, como inserir novos dados, recuperar o tamanho da lista, entre outras. Comentários: Perfeito! Ele simplifica a implementação de algumas operações porque se guarda o endereço do primeiro e do último elemento de uma estrutura de dados de modo que o programador não precisa conhecer a estrutura de implementação da lista para realizar suas operações. 16712855225
Gabarito: C (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) Estruturas ligadas como listas encadeadas superam a limitação das matrizes que não podem alterar seu tamanho inicial. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 18 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Perfeito! Listas Encadeadas item alocação dinâmica, em contraste com as matrizes. Gabarito: C (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) As listas duplamente encadeadas diferenciam-se das listas simplesmente encadeadas pelo fato de, na primeira, os nós da lista formarem um anel com o último elemento ligado ao primeiro da lista. Comentários: Não, a diferença é que Listas Duplamente Encadeadas possuem dois ponteiros, que apontam para o nó sucessor e para o nó predecessor e Listas Simplesmente Encadeadas possuem apenas um ponteiro, que aponta para o nó sucessor. Gabarito: E (FCC - 2012 - TRE- - Analista Judiciário - Análise de Sistemas - E) Numa lista singularmente encadeada, para ar o último nodo é necessário partir do primeiro e ir seguindo os campos de ligação até chegar ao final da lista. Comentários: Perfeito. Se é uma lista singularmente encadeada, é necessário percorrer cada elemento um-a-um até chegar ao final da lista. Gabarito: C 16712855225
(CESPE - 2011 - EBC - Analista - Engenharia de Software) Uma lista é uma coleção de elementos do mesmo tipo dispostos linearmente, que podem ou não seguir determinada organização. As listas podem ser dos seguintes tipos: de encadeamento simples, duplamente encadeadas e ordenadas. Comentários: Uma lista é, por natureza, heterogênea, i.e., seus elementos são compostos por tipos de dados primitivos diferentes. A questão afirmou que a lista é uma coleção de elementos do mesmo tipo. E ela está certa, veja só o peguinha da questão:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 19 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Eu crio um tipo composto por dois tipos de dados diferentes: tipoEstrategia = {curso: caractere; duracao: inteiro}. Observe que o tipo tipoEstrategia é composto por tipos de dados primitivos diferentes (caractere e inteiro). Agora eu crio uma lista ListaEstrategia: tipoEstrategia. Veja que todos os elementos dessa lista terão o mesmo tipo (tipoEstrategia). Em outras palavras: a Lista Heterogênea é composta por elementos do mesmo tipo que, em geral, são compostos por mais de um tipo primitivo. Além disso, as listas podem ser simplesmente encadeadas, duplamente encadeadas e ordenadas. E ainda podem ser circulares. Observem que alguns autores consideram Listas Ordenadas como um tipo de lista! Como, professor? Ela é uma lista em que seus elementos são ordenados (crescente ou decrescente). Gabarito: C (CESPE - ANAC - Técnico istrativo - Informática) Em uma lista circular duplamente encadeada, cada nó aponta para dois outros nós da lista, um anterior e um posterior. Comentários: Perfeito! Há dois ponteiros: uma para o nó anterior e um para o nó posterior. Gabarito: C (CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação) A principal característica de uma lista encadeada é o fato de o último elemento da lista apontar para o elemento imediatamente anterior. Comentários:
16712855225
Não, o último elemento da lista não aponta para nenhum outro nó em uma lista não-circular. Gabarito: E (CESPE - TCE-AC - Analista de Controle Externo - Processamentos de Dados) Uma lista encadeada é uma coleção de nodos que, juntos, formam uma ordem linear. Se é possível os nodos se deslocarem em ambas as direções na lista, diz-se que se trata de uma lista simplesmente encadeada.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 20 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Comentários: Se é possível os nodos se deslocarem em ambas as direções na lista, diz-se que se trata de uma lista duplamente encadeada. Gabarito: E 10. (CESPE - 2008 – HEMOBRÁS – Técnico de Informática) Uma estrutura do tipo lista, em que é desejável percorrer o seu conteúdo nas duas direções indiferentemente, é denominado lista duplamente encadeada. Comentários: Perfeito, é exatamente isso! Gabarito: C 11. (CESPE - 2010 – TRE/MT – Analista de Sistemas – C) Uma lista duplamente encadeada é uma lista em que o seu último elemento referencia o primeiro. Comentários: Não, isso se trata de uma Lista Circular! Gabarito: E 12. (CESPE - 2006 – SGA/AC – Analista de Sistemas) O principal problema da alocação por lista encadeada é a fragmentação. 16712855225
Comentários: Não! Em geral, a alocação por lista encadeada elimina a fragmentação. Gabarito: E 13. (CESPE – MCT – Analista de Sistemas) O armazenamento de arquivos em disco pode ser feito por meio de uma lista encadeada, em que os blocos de disco são ligados por ponteiros. A utilização de lista encadeada elimina completamente o problema de fragmentação interna.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 21 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Comentários: Não, ela elimina a fragmentação externa! Gabarito: E 14. (CESPE – FINEP – Analista de Sistemas) Uma lista encadeada é uma representação de objetos na memória do computador que consiste de uma sequência de células em que: a) cada célula contém apenas o endereço da célula seguinte. b) cada célula contém um objeto e o tipo de dados da célula seguinte. c) o último elemento da sequência aponta para o próximo objeto que normalmente possui o endereço físico como not null. d) cada célula contém um objeto de algum tipo e o endereço da célula seguinte. e) a primeira célula contém o endereço da última célula. Comentários: Cada célula contém um objeto de algum tipo e o endereço da célula seguinte! Gabarito: D 15. (CESPE - 2010 – BASA – Analista de Sistemas) Em uma lista encadeada, o tempo de o a qualquer um de seus elementos é constante e independente do tamanho da estrutura de dados. 16712855225
Comentários: Claro que não! Em uma busca sequencial, o tempo de o é proporcional ao tamanho da estrutura de dados, i.e., quanto mais ao final da lista, maior o tempo de o! Por que, professor? Porque a lista é ada sequencialmente (ou seja, é preciso percorrer elemento por elemento) e, não, diretamente (ou seja, pode-se ar de modo direto). Um vetor tem o direto, portanto seu tempo de o é igual independentemente do tamanho da estrutura.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 22 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Gabarito: E 16. (CESPE - 2010 – INMETRO – Analista de Sistemas – C) Considere que Roberto tenha feito uso de uma lista encadeada simples para programar o armazenamento e o posterior o aos dados acerca dos equipamentos instalados em sua empresa. Considere, ainda, que, após realizar uma consulta acerca do equipamento X, Roberto precisou ar outro equipamento Y que se encontrava, nessa lista, em posição anterior ao equipamento X. Nessa situação, pela forma como os ponteiros são implementados em uma lista encadeada simples, o algoritmo usado por Roberto realizou a consulta ao equipamento Y sem reiniciar a pesquisa do começo da lista. Comentários: Não! Infelizmente, ele teve que reiniciar a pesquisa a partir do primeiro elemento da lista, na medida em que ele não pode voltar. Por que, professor? Porque se trata de uma lista encadeada simples e, não, dupla. Portanto, a lista só é percorrida em uma única direção. Gabarito: E 17. (FCC – TRE/ encadeada estão: a) b) c) d) e)
– Analista de Sistemas) Os dados contidos em uma lista
ordenados seqüencialmente. sem ordem lógica ou física alguma. em ordem física e não, necessariamente, em ordem lógica. em ordem lógica e, necessariamente, em ordem física. em ordem lógica e não, necessariamente, em ordem física. 16712855225
Comentários: A Ordem Física é sua disposição na memória do computador e a Ordem Lógica é como ela pode ser lida e entendida. Ora, a ordem em que ela se encontra na memória pouco importa, visto que cada sistema operacional e cada sistema de arquivos tem sua maneira. Portanto, trata-se da ordem lógica e, não, necessariamente física. Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 23 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
18. (FCC - 2010 – DPE/SP – Analista de Sistemas) Uma estrutura de dados que possui três campos: dois ponteiros e campo de informação denomina-se: a) b) c) d) e)
lista encadeada dupla. Lista encadeada simples. pilha. fila. vetor.
Comentários: Trata-se da Lista Encadeada Dupla: dois ponteiros (Ant e Prox) e um campo de informação. Gabarito: A 19. (CESPE - 2010 – TRE/MT – Analista de Sistemas) O algoritmo para inclusão de elementos em uma pilha é usado sem nenhuma alteração para incluir elementos em uma lista. Comentários: Galera... uma pilha pode ser implementada por meio de uma lista! Ademais, o algoritmo para inclusão de elementos de ambas necessita do primeiro elemento (ou topo). Portanto, questão correta! Gabarito: C ACERTEI
Prof. Diego Carvalho
16712855225
www.estrategiaconcursos.com.br
ERREI
Pág. 24 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 PILHAS
A Pilha é um conjunto ordenado de itens no qual novos itens podem ser inseridos e eliminados em uma extremidade chamada topo. Novos itens podem ser colocados no topo da pilha (tornando-se o novo primeiro elemento) ou os itens que estiverem no topo da pilha poderão ser removidos (tornando-se o elemento mais abaixo o novo primeiro elemento). Também conhecida como Lista LIFO (Last In First Out), basta lembrar de uma pilha de pratos esperando para serem lavados, i.e., o último a entrar é o primeiro a sair. A ordem em que os pratos são retirados da pilha é o oposto da ordem em que eles são colocados sobre a pilha e, como consequência, apenas o prato do topo da pilha está ível.
16712855225
As Pilhas oferecem três operações básicas: push, que insere um novo elemento no topo da pilha; pop, que remove um elemento do topo da pilha; e top (também conhecida como check), que a e consulta o elemento do topo da pilha. Pilhas podem ser implementadas por meio de Vetores (Pilha Sequencial - Alocação Estática de Memória) ou Listas (Pilha Encadeada - Alocação Dinâmica de Memória).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 25 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2011 - FUB - Analista de Tecnologia da Informação - Específicos) As pilhas são listas encadeadas cujos elementos são retirados e acrescentados sempre ao final, enquanto as filas são listas encadeadas cujos elementos são retirados e acrescentados sempre no início. Comentários: Bem... o que é o final de uma Pilha? Pois é, não se sabe! O que existe é o Topo da Pilha, de onde sempre são retirados e acrescentados elementos. Em Filas, elementos são retirados do início e acrescentados no final. Gabarito: E (CESPE - 2013 - INPI - Analista de Planejamento - Desenvolvimento e Manutenção de Sistemas) Na estrutura de dados do tipo lista, todo elemento novo que é introduzido na pilha torna-se o elemento do topo. Comentários: Galera... filas e pilhas são considerados espécies de lista. Como a questão não especificou sobre qual tipo de lista ela está se referindo, não se pode afirmar que todo elemento novo que é introduzido na pilha torna-se o elemento do topo. Questão extremamente mal escrita e que causou a alteração de gabarito de verdadeiro para falso. 16712855225
Gabarito: E (CESPE - 12 - -RO - Analista Judiciário - Analista de Sistemas e – E) Visitas a sítios armazenadas em um navegador na ordem last-in-first-out é um exemplo de lista. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 26 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Não! Last-In-First-Out (LIFO) é um exemplo de Pilha! Cuidado, pilhas podem ser implementadas como listas, mas esse não é o foco da questão. Gabarito: E (ESAF - 2013 - DNIT - Analista istrativo - Tecnologia da Informação) Assinale a opção correta relativa às operações básicas adas por pilhas. a) Push: insere um novo elemento no final da pilha. b) Pop: adiciona elementos ao topo da pilha. c) Pull: insere um novo elemento no interior da pilha. d) Top: transfere o último elemento para o topo da pilha. e) Top: a o elemento posicionado no topo da pilha. Comentários: (a) Não, é no topo; (b) Não, remove do topo; (c) Não, não existe; (d) Não, simplesmente a e consulta o elemento do topo; (e) Perfeito! Gabarito: E (FCC - 2012 – TST - Analista de Sistemas – C) As pilhas e as filas são estruturas de dados essenciais para os sistemas computacionais. É correto afirmar que a pilha é conhecida como lista FIFO - First In First Out. Comentários: Não! Pilha é LIFO e Fila é FIFO. 16712855225
Gabarito: E (FCC - 2012 – TRE/CE - Analista de Sistemas) Sobre pilhas é correto afirmar: a) Uma lista LIFO (Last-In/First-Out) é uma estrutura estática, ou seja, é uma coleção que não pode aumentar e diminuir durante sua existência. b) Os elementos na pilha são sempre removidos na mesma ordem em que foram inseridos.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 27 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
c) Uma pilha a apenas duas operações básicas, tradicionalmente denominadas push (insere um novo elemento no topo da pilha) e pop (remove um elemento do topo da pilha). d) Cada vez que um novo elemento deve ser inserido na pilha, ele é colocado no seu topo e, em qualquer momento, apenas aquele posicionado no topo da pilha pode ser removido. e) Sendo P uma pilha e x um elemento qualquer, a operação Push(P,x) diminui o tamanho da pilha P, removendo o elemento x do seu topo. Comentários: (a) Não, é uma estrutura dinâmica; (b) Não, é na ordem inversa (último a entrar é o primeiro a sair); (c) Não, há também Top ou Check, que ar e consulta o elemento do topo; (d) Perfeito, é exatamente isso; (e) Push é a operação de inserção de novos elementos na pilha, portanto aumenta seu tamanho adicionando o elemento x no topo. Gabarito: D (CESPE - 2011 - EBC - Analista - Engenharia de Software) As pilhas, também conhecidas como listas LIFO ou PEPS, são listas lineares em que todas as operações de inserção e remoção de elementos são feitas por um único extremo da lista, denominado topo. Comentários: Não! LIFO é similar a UEPS (Último a Entrar, Primeiro a Sair). PEPS refere-se a Primeiro a Entrar, Primeiro a Sair, ou seja, FIFO. 16712855225
Gabarito: E (VUNESP - 2011 - TJM- - Analista de Sistemas - Judiciário) Lista do tipo LIFO (Last in, First Out) e lista do tipo FIFO (Firstin,First Out) são, respectivamente, características das estruturas de dados denominadas: a) Fila e Pilha. b) Pilha e Fila. c) Grafo e Árvore. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 28 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
d) Árvore e Grafo. e) Árvore Binária e Árvore Ternária. Comentários: E aí, já está automático para responder? Tem que ser automática: Pilha (LIFO) e Fila (FIFO). Gabarito: B (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Arquitetura de Tecnologia A definição da estrutura pilha permite a inserção e a eliminação de itens, de modo que uma pilha é um objeto dinâmico, cujo tamanho pode variar constantemente. Comentários: Essa questão é polêmica, porque é inevitável pensar em Pilhas Sequenciais (implementadas por vetores estáticos)! No entanto, é comum que as bancas tratem por padrão Pilha como Pilha Encadeada (implementadas por listas dinâmicas). Dessa forma, a questão está perfeita! Gabarito: C 10. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - istração de Dados) Na representação física de uma pilha sequencial, é necessário uso de uma variável ponteiro externa que indique a extremidade da lista linear onde ocorrem as operações de inserção e retirada de nós. 16712855225
Comentários: As Pilhas oferecem três operações básicas: push, que insere um novo elemento no topo da pilha; pop, que remove um elemento do topo da pilha; e top (também conhecida como check), que a e consulta o elemento do topo da pilha. Pilhas podem ser implementadas por meio de Vetores (Pilha Sequencial - Alocação Estática de Memória) ou Listas (Pilha Encadeada - Alocação Dinâmica de Memória). Conforme vimos em aula, a questão trata de uma Pilha Sequencial (i.e., implementada por meio de Vetores). Dessa forma, não é necessário o uso de Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 29 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
ponteiros – esse seria o caso de uma Pilha Encadeada. Eu posso realmente dizer que é suficiente, mas não posso afirmar que é necessária a utilização de um ponteiro externo. Eu até poderia dizer que é necessário o uso de um indicador, mas ele também não necessariamente será um ponteiro. Logo, discordo do gabarito! Gabarito: C 11. (CESPE - ANAC - Técnico istrativo - Informática) As operações de inserir e retirar sempre afetam a base de uma pilha. Comentários: Não, sempre afetam o topo da pilha! Gabarito: E 12. (FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação) Pilha é uma estrutura de dados: a) cujo o aos seus elementos segue tanto a lógica LIFO quanto a FIFO. b) cujo o aos seus elementos ocorre de forma aleatória. c) que pode ser implementada somente por meio de vetores. d) que pode ser implementada somente por meio de listas. e) cujo o aos seus elementos segue a lógica LIFO, apenas. Comentários: (a) Não, somente LIFO; (b) Não, somente pelo Topo; (c) Não, pode ser por listas; (d) Não, pode ser por vetores; (e) Perfeito, é exatamente isso. 16712855225
Gabarito: E 13. (CESPE - 04 – STJ – Analista de Sistemas Em geral, em uma pilha só se ite ter o ao elemento localizado em seu topo. Isso se adapta perfeitamente à característica das seqüências em que só o primeiro componente é diretamente ível. Comentários: Perfeito, é exatamente isso – muda-se apenas a perspectiva! Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 30 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Gabarito: C 14. (CESPE - 2004 – STJ – Analista de Sistemas) A seguir, está representada corretamente uma operação de desempilhamento em uma pilha de nome p. se p.topo = 0 então nada {pilha vazia} senão p.topo p.topo-1 Comentários: Perfeito! Se não tem topo, é porque a pilha está vazia. Se tiver topo, então o topo será o elemento anterior ao topo. O que ocorreu? Eu desempilhei a pilha! Gabarito: C 15. (CESPE - 2010 – TRE/MT - Analista de Sistemas – A) O tipo nó é inadequado para implementar estruturas de dados do tipo pilha. Comentários: Não! Uma pilha pode ser implementada por meio de um vetor ou de uma lista. Nesse último caso, temos tipos nós! Gabarito: E 16. (FGV – 2015 – DPE/ – Analista de Sistemas) Assinale a opção que apresenta a estrutura de dados na qual o primeiro elemento inserido é o último a ser removido. 16712855225
a) Árvore b) Fila c) Pilha d) Grafo e) Tabela de dispersão Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 31 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Também conhecida como Lista LIFO (Last In First Out), basta lembrar de uma pilha de pratos esperando para serem lavados, i.e., o último a entrar é o primeiro a sair. A ordem em que os pratos são retirados da pilha é o oposto da ordem em que eles são colocados sobre a pilha e, como consequência, apenas o prato do topo da pilha está ível. Conforme vimos em aula, trata-se da Pilha. Gabarito: C ACERTEI
ERREI
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 32 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 FILAS
Uma fila é um conjunto ordenado de itens a partir do qual podem-se eliminar itens numa extremidade (chamada início da fila) e no qual podem-se inserir itens na outra extremidade (chamada final da fila). Também conhecida como Lista FIFO (First In First Out), basta lembrar de uma fila de pessoas esperando para serem atendidas em um banco, i.e., o primeiro a entrar é o primeiro a sair.
Quando um elemento é colocado na fila, ele ocupa seu lugar no fim da fila, como um aluno recém-chegado que ocupa o final da fileira. O elemento retirado da fila é sempre aquele que está no início da fila, como o aluno que se encontra no começo da fileira e que esperou mais tempo. As operações básicas são Enqueue (Enfileirar) e Dequeue (Desenfileirar). As Filas possuem início (ou cabeça) e fim (ou cauda). 16712855225
É bom salientar outro conceito importante: Deque (Double Ended Queue)! É também conhecida como Filas Duplamente Encadeadas e permite a eliminação e inserção de itens em ambas as extremidades. Ademais, elas permitem algum tipo de priorização, visto que é possível inserir elementos de ambos os lados. Assim sendo, é comum em sistemas distribuídos!
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 33 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Análise de Sistemas) Em um programa existe a necessidade de guardar todas as alterações feitas em determinado dado para que seja possível desfazer alterações feitas ao longo de toda a sua existência. Nessa situação, a estrutura de dados mais adequada para o armazenamento de todas as alterações citadas seria uma fila. Comentários: Não! Pensem comigo: eu faço uma atividade, depois outra, depois mais uma e, por fim, mais outra. Se eu desejo desfazer a última atividade realizada para retornar a um estado anterior, eu preciso de uma pilha. Dessa forma, resgata-se o último estado válido e, não, o primeiro. Gabarito: E (CESPE - 2012 – TST – Analista de Sistemas – A) As pilhas e as filas são estruturas de dados essenciais para os sistemas computacionais. É correto afirmar que a fila é conhecida como lista LIFO - Last In First Out. Comentários: Não, Fila é FIFO!
16712855225
Gabarito: E (CESPE - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas) As filas são estruturas com base no princípio LIFO (last in, first out), no qual os dados que forem inseridos primeiro na fila serão os últimos a serem removidos. Existem duas funções que se aplicam a todas as filas: PUSH, que insere um dado no topo da fila, e POP, que remove o item no topo da fila. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 34 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Não, isso é uma Pilha (LIFO). Gabarito: E (FCC - 2012 - MPE-AP – Analista de Sistemas - A) Nas estruturas de dados, devido às características das operações da fila, o primeiro elemento a ser inserido será o último a ser retirado. Estruturas desse tipo são conhecidas como LIFO. Comentários: Não, será o primeiro a ser retirado – são do tipo FIFO! Gabarito: E (FCC - 2012 - MPE-AP – Analista de Sistemas - C) Nas estruturas de dados, a fila é uma lista linear na qual as operações de inserção e retirada ocorrem apenas no início da lista. Comentários: Não, isso é a definição de Pilha! Gabarito: E (FCC - 2012 - TRE- - Analista Judiciário - Análise de Sistemas – D) Pela definição de fila, se os elementos são inseridos por um extremo da lista linear, eles só podem ser removidos pelo outro. Comentários:
16712855225
Perfeito, é exatamente isso! Gabarito: C (FCC - 2011 - TRT - 19ª Região (AL) - Analista Judiciário - Tecnologia da Informação) FIFO refere-se a estruturas de dados do tipo: a) fila. b) árvore binária. c) pilha. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 35 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
d) matriz quadrada. e) cubo. Comentários: Trata-se da Fila! Gabarito: A (ESAF - 2010 - CVM - Analista de Sistemas - prova 2) Uma fila é um tipo de lista linear em que: a) as inserções são realizadas em um extremo e as remoções no outro extremo. b) as inserções e remoções são realizadas em um mesmo extremo. c) podem ser realizadas apenas inserções. d) a inserção de um elemento requer a remoção de outro elemento. e) a ordem de saída não corresponde à ordem de entrada dos elementos. Comentários: As inserções são realizadas em um extremo e as remoções são realizadas no outro extremo, por isso é FIFO! Gabarito: A (CESPE - 2010 - DETRAN-ES - Analista de Sistemas) No armazenamento de dados pelo método FIFO (first in - first out), a estrutura de dados é representada por uma fila, em cuja posição final ocorrem inserções e, na inicial, retiradas. 16712855225
Comentários: Perfeito, é exatamente isso! Gabarito: C 10. (CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação) Entre alguns tipos de estrutura de dados, podem ser citados os vetores, as pilhas e as filas. Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 36 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Perfeito, são todos exemplos de estruturas de dados! Gabarito: C 11. (CESPE - 2004 – SES/PA – Analista de Sistemas) Uma estrutura mais geral que as pilhas e filas é o deque, em que as inserções, retiradas e os são permitidos em ambas as extremidades. Comentários: Perfeito, deques permitem todas essas operações! Gabarito: C 12. (CESPE – TCE/AC – Analista de Sistemas – D) Um deque (double ended queue) requer inserção e remoção no topo de uma lista e permite a implementação de filas com algum tipo de prioridade. A implementação de um deque, geralmente é realizada com a utilização de uma lista simplesmente encadeada. Comentários: Não, pode ser do início ou fim da lista! De fato, permite a implementação de filas com algum tipo de prioridade, mas geralmente é realizada com a utilização de filas duplamente encadeadas. Gabarito: E 16712855225
13. (FCC - 2007 – TRT/23 – Analista de Sistemas) Uma estrutura de dados com vocação de FIFO de duplo fim e que ite a rápida inserção e remoção em ambos os extremos é: a) b) c) d) e)
uma pilha. uma splay tree. um deque. uma lista linear. uma árvore AVL.
Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 37 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Trata-se de um Deque – fila duplamente encadeada! Gabarito: C 14. (CESPE - 2004 – PBV/RR - Analista de Sistemas) As filas com prioridade são listas lineares nas quais os elementos são pares da forma (qi, pi), em que q é o elemento do tipo base e p é uma prioridade. Elas possuem uma política de fila do tipo FIFO (first in first out) entre os elementos de mesma prioridade. Comentários: Perfeito! É assim que funciona a prioridade em conjunto com filas. Gabarito: C 15. (CESPE - 2004 – STJ – Analista de Sistemas) A seguir, está representada corretamente uma operação de retirada em uma fila de nome f. se f.começo = nil então erro {fila vazia} senão j f.começo.info Comentários: Não, o correto seria: se f.começo = nil então erro {fila vazia} senão f.começo f.começo - 1
16712855225
Gabarito: E ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 38 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 ÁRVORES
Uma árvore é uma estrutura de dados hierárquica (não-linear) composta por um conjunto finito de elementos com um único elemento raiz, com zero ou mais subárvores ligadas a esse elemento raiz. Como mostra a imagem abaixo, há uma única raiz, em amarelo. Há também nós folhas, em vermelho e seus pais, em verde. Observem ainda os conceitos de Altura, Grau e Nível de uma árvore.
16712855225
O Grau informa a quantidade de filhos de um determinado nó! A Raiz tem Nível 0 (excepcionalmente, alguns autores consideram que tem Nível 1) e o nível de qualquer outro nó na árvore é um nível a mais que o nível de seu pai. Por fim, a Altura equivale ao nível máximo de seus nós. Dessas informações, podemos concluir que toda folha tem Grau 0. Existe um tipo particular de árvore chamado: Árvore Binária! O que é isso? É uma estrutura de dados hierárquica em que todos os nós têm grau 0, 1 ou 2. Já uma Árvore Estritamente Binária é aquela em que todos os nós têm grau 0 ou 2. E uma Árvore Binária Completa é aquela em que todas as folhas estão no mesmo nível, como mostram as imagens abaixo.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 39 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 40 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Uma Árvore Binária Completa com x folhas conterá sempre (2x – 1) nós. Observem a imagem acima e façam as contas: 2*8 – 1 = 15 nós! Uma árvore binária completa de altura h e nível n contém (2h-1) ou n -1) nós e usa-se (2n para calcular a quantidade de nós em determinado nível. Na imagem acima, há uma árvore de h = 4 e n = 3; logo, existem 23+1 -1 = 15 nós no total; e no Nível 3, existe 23 = 8 nós.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 41 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) As operações de busca em uma árvore binária não a alteram, enquanto operações de inserção e remoção de nós provocam mudanças sistemáticas na árvore. Comentários: Perfeito! Operações de Busca não alteram nenhuma estrutura de dados. Já Operações de Inserção e Remoção podem provocar diversas mudanças estruturais. Gabarito: C (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) O tipo de dados árvore representa organizações hierárquicas entre dados. Comentários: Perfeito, observem que alguns autores tratam Tipos de Dados como sinônimo de Estruturas de Dados. Gabarito: C 16712855225
(CESPE - 2010 - DETRAN-ES - Analista de Sistemas) Denomina-se árvore binária a que possui apenas dois nós. Comentários: Não, árvore binária é aquela em que cada nó tem, no máximo, dois filhos! Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 42 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - ANAC - Especialista em Regulação - Economia) Considerandose uma árvore binária completa até o nível 5, então a quantidade de folhas nesse nível será 24. Comentários: Não! A quantidade de folhas em um determinado nível – considerando a raiz como nível 0 –, é dada pela fórmula 2d, portanto 25. Gabarito: E (CESPE – ANAC - Analista de Sistemas) Uma árvore binária completa até o nível 10 tem 2.047 nós. Comentários: Se possui 10 níveis, possui (2d+1 -1): 2047 nós! Gabarito: C (CESPE - 2010 – TRE/MT – Analista de Sistemas – B) As listas, pilhas, filas e árvores são estruturas de dados que têm como principal característica a sequencialidade dos seus elementos. Comentários: Não! Árvores ntêm como principal característica a sequencialidade dos seus elementos. 16712855225
Gabarito: E (CESPE - 2010 – TRE/MT - Analista de Sistemas – E) O uso de recursividade é totalmente inadequado na implementação de operações para manipular elementos de uma estrutura de dados do tipo árvore. Comentários: Pelo contrário, é fundamental para implementação de operações. Gabarito: E Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 43 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2011 – STM – Analista de Sistemas) Enquanto uma lista encadeada somente pode ser percorrida de um único modo, uma árvore binária pode ser percorrida de muitas maneiras diferentes. Comentários: Galera, pense em uma árvore bem simples com um pai (raiz) e dois filhos. O Modo Pré-fixado vai ler primeiro a raíz, depois a sub-árvore da esquerda e depois a subárvore da direita. O Modo In-fixado vai ler primeiro a sub-árvore da esquerda, depois a raiz e depois a sub-árvore da direita. O Modo Pós-fixado vai ler primeiro a sub-árvore da esquerda, depois a sub-árvore da direita e depois a raiz. Vamos resumir: o modo de percorrimento de uma árvore pode obedecer três regras de acordo com a posição da raiz (pai): pré-fixado (raiz, esquerda, direita); in-fixado (esquerda, raiz, direita); e pós-fixada (esquerda, direita, raiz). Vamos agora ver uma árvore de exemplo: X / Y
\ Z
- Percorrimento Pré-fixado: X Y Z - Percorrimento In-fixado: Y X Z - Percorrimento Pós-fixado: Y Z X Logo, uma árvore pode ser percorrida de modo pré-fixado, in-fixado e pós-fixado. Gabarito: C
16712855225
ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 44 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(FCC - 2012 - MPE-AP - Analista Ministerial - Tecnologia da Informação – A) A árvore é uma estrutura linear que permite representar uma relação de hierarquia. Ela possui um nó raiz e subárvores não vazias. Comentários: Árvore é uma estrutura linear? Não, hierárquica! Gabarito: E (FCC - 2011 - TRT - 19ª Região (AL) - Técnico Judiciário - Tecnologia da Informação) Em uma árvore binária, todos os nós têm grau: a) 2. b) 0, 1 ou 2. c) divisível por 2. d) maior ou igual a 2. e) 0 ou 1. mentários: Olha a pegadinha! Todos os nós têm grau 0 (Folha), 1 (Único filho) ou 2 (Dois filhos). 16712855225
Gabarito: B ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 45 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CETAP - 2010 - - - Analista de Sistemas - A) Uma árvore binária é aquela que tem como conteúdo somente valores binários. Comentários: Não! Uma árvore binária é aquela que tem, no máximo, grau 2! Gabarito: E (CETAP - 2010 - - - Analista de Sistemas - B) Uma árvore é composta por duas raízes, sendo uma principal e a outra secundária. Comentários: Não, uma árvore possui somente um nó raíz! Gabarito: E (FUNCAB - 2010 - SEJUS-RO - Analista de Sistemas - II) Árvores são estruturas de dados estáticas com sua raiz representada no nível um. Comentários: 16712855225
Não! Árvores são estruturas dinâmicas e sua raiz, em geral, é representada no nível 0 (mas depende de autor para autor). Gabarito: E ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 46 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 GRAFOS
Fiz uma disciplina na faculdade chamada Teoria dos Grafos! Aquilo era absurdamente complexo, mas para concursos a teoria é beeeem mais tranquila e muito rara de cair. Portanto fiquem tranquilos, bacana? Uma definição de grafo afirma que ele é uma estrutura de dados que consiste em um conjunto de nós (ou vértices) e um conjunto de arcos (ou arestas). Em outras palavras, podemos dizer que é simplesmente um conjunto de pontos e linhas que conectam vários pontos. Ou também que é uma representação abstrata de um conjunto de objetos e das relações existentes entre eles. Uma grande variedade de estruturas do mundo real podem ser representadas abstratamente através de grafos. Professor, pode me ar um exemplo? Claro!
16712855225
Vejam só como se trata de um conceito bastante abrangente! O Facebook pode ser considerado um grafo (pessoas se interligam através de amizades); um mapa rodoviário pode ser considerado um grafo (cidades se relacionam através de estradas); as eliminatórias de um campeonato de futebol também podem ser consideradas um grafo (times jogam entre si para ganhar o campeonato). Abaixo temos um exemplo de um grafo que eu desenhei e que nos ajudará a entender melhor a terminologia utilizada. Seguem as premissas: N = {A, B, C, D, E, F} A = {(A,B), (B,A), (B,C), (B,D), (C,C), (D,A), (D,C), (E,F)}
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 47 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Nó, Nodo ou Vértice: Qualquer elemento de um conjunto N. Aresta ou Arco: Qualquer elemento de um conjunto A. Nós Adjacentes (Relação de Adjacência): São aqueles nós ligados por um arco (Ex: A é adjacente a D). 16712855225
Arco Incidente (Relação de Incidência): São aqueles arcos que levam a um nó (Ex: (C,D) é incidente em D). Grau: É a quantidade de arcos que partem ou chegam em/de um nó. Caminho: Sequência de arcos que levam de um nó a outro (Ex: AC <(A,B), (B,D), (D,C)>).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 48 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Circuito ou Ciclo: É o caminho que leva ao mesmo nó do qual saiu (Ex: <(A,B), (B,D), (D,A)>). Laço: É o circuito de um único arco (<(C,C)>). Ordem: É a quantidade de vértices totais do grafo.
Vamos ver agora alguns conceitos importantes! Um grafo pode ser dirigido – também chamado direcionado, orientado ou dígrafo –, se as arestas tiverem uma direção (imagem da esquerda), ou não dirigido, se as arestas não tiverem direção (imagem central). Se as arestas tiverem associado um peso ou custo, o grafo a ser chamado ponderado, valorado ou pesado (imagem da direita).
Um grafo simples é aquele que não contém laços. Um grafo vazio é aquele que contém exclusivamente vértices (não contém arcos). Um grafo misto é aquele que possui arestas dirigidas e não-dirigidas. Um grafo trivial é aquele que possui somente um vértice. Um grafo é denso se contém muitos arcos em relação ao número de vértices e esparso se contém poucos arcos. Como assim, professor? Um grafo é denso se o seu número de arcos é da mesma ordem que o quadrado do número de vértices; e é esparso se o número de arcos for da mesma ordem que o número de vértices. Um grafo é regular se todos os vértices têm o mesmo grau; e é completo se todo vértice é adjacente a todos os outros vértices (o grafo ao lado é regular e completo). 16712855225
Um grafo é dito conexo ou conectado quando existir pelo menos um caminho entre cada par de vértices. Caso contrário, ele será dito desconexo, isto é, se há pelo menos um par de vértices que não esteja ligado a nenhuma cadeia (caminho). Vejam a imagem do grafo que eu desenhei lá em cima! Ele é conexo ou desconexo? Ele é desconexo, há um par de vértices (E,F) que não está ligado a nenhum caminho.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 49 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Se o grafo for direcionado/orientado, um grafo é dito fortemente conexo se existir um caminho de A B e de B A, para cada par (A,B) de vértices de um grafo. Em outras palavras, o grafo é fortemente conexo se cada par de vértices participa de um circuito. Isto significa que cada vértice pode ser alcançável partindo-se de qualquer outro vértice do grafo. Galera, existem outras maneiras de representar um grafo. Uma das maneiras mai comuns é por meio de uma Matriz de Adjacências. A definição precisa das entradas da matriz varia de acordo com as propriedades do grafo que se deseja representar, porém de forma geral o valor aij guarda informações sobre como os vértices vi e vj estão relacionados (isto é, informações sobre a adjacência de vi e vj). Para representar um grafo não direcionado, simples e sem pesos, basta que as entradas a da Matriz A contenham 1 se vi e vj são adjacentes e 0, caso contrário. Se as arestas do grafo tiverem pesos, aij pode conter, ao invés de 1 quando houver uma aresta entre vi e vj, o peso dessa mesma aresta.
Vamos entender? O elemento A11 = 1, significando que o Nó 1 tem adjacência com o Nó 1 (ele mesmo, basta ver a figura); o elemento A12 = 1, significando que o Nó 1 tem adjacência com o Nó 2; elemento A13 = 0, significando que o Nó 1 não tem adjacência com o Nó 3; o elemento A14 = 0, significando que o Nó 1 não tem adjacência com o Nó 4. 16712855225
O elemento A15 = 1, significando que o Nó 1 tem adjacência com o Nó 5; o elemento A16 = 0, significando que o Nó 1 não tem adjacência com o Nó 3. Galera, agora ficou Fácil de entender, concordam? Lembrando que, se fosse um grafo ponderado, bastaria colocar o peso, em vez de colocar 1 na Matriz de Adjacências. Existem só mais alguns detalhes. Em grafos não direcionados, as matrizes de adjacência são simétricas ao longo da diagonal principal - isto é, a entrada aij é igual à entrada aji. Matrizes de Adjacência de grafos direcionados, no entanto, não são assim. Num dígrafo sem pesos, a
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 50 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
entrada aij da matriz é 1 se há um arco de vi para vj e 0, caso contrário. Há outra maneira de representar também chamada Lista de Adjacências. Se o grafo é não direcionado, cada entrada é um conjunto de dois nós contendo as duas extremidades da aresta correspondente; se ele for dirigido, cada entrada é uma tupla de dois nós, um indicando o nó de origem e o outro denotando o nó destino do arco correspondente. É bem simples, para cada nó, eu escrevo suas adjacências. No exemplo anterior: Nó 1 = 1, 2, 5; Nó 2 = 1, 3, 5; e assim por diante.
Professor, qual é melhor? Cara, cada representação tem suas vantagens e desvantagens! É fácil encontrar todos os vértices adjacentes a um vértice dada em uma representação lista de adjacência; você simplesmente lê a sua lista de adjacência. Com uma matriz de adjacência em vez disso se tem que pesquisar mais de uma linha inteira, gastando tempo O(n). 16712855225
Se, pelo contrário, deseja realizar um teste de vizinhança em dois vértices (isto é, determinar se eles têm uma aresta entre eles), uma matriz de adjacência proporciona isso na hora. No entanto, este teste de vizinhança em uma lista de adjacências requer tempo proporcional ao número de arestas associado com os dois vértices. Há diversos outros aspectos também a considerar, como tamanho. Pensem comigo! Para um grafo com uma Matriz de Adjacência esparsa (não densa), uma representação de Lista de Adjacências do grafo ocupa menos espaço, porque ele não usa nenhum espaço para representar as arestas que não estão presentes. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 51 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Lembram-se da lista? Nós só representamos os nós adjacentes, em contraste com a Matriz de Adjacência. No entanto, quanto mais denso, isso pode mudar.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 52 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2010 – TJ/ES – Analista de e Considerando-se a implementação de um grafo denso, direcionado e ponderado, se o número de vértices ao quadrado tem valor próximo ao número de arcos, o uso de uma matriz de adjacência simétrica apresenta vantagens em relação ao uso de uma lista de adjacência. Comentários: Em grafos não direcionados, as matrizes de adjacência são simétricas ao longo da diagonal principal - isto é, a entrada aij é igual à entrada aji. Matrizes de Adjacência de grafos direcionados, no entanto, não são assim. Num dígrafo sem pesos, a entrada aij da matriz é 1 se há um arco de vi para vj e 0, caso contrário. Há outra maneira de representar também chamada Lista de Adjacências. Vamos por partes! Ele afirma que o grafo é denso, direcionado e ponderado. Em seguida, ele afirma que o número de vértices ao quadrado tem valor próximo ao número de arcos. Precisava dizer isso? Não está errado, mas ele já havia afirmado que era um grafo denso. A Matriz de Adjacência simétrica é uma representação utilizada em grafos não-direcionados, logo a questão já está errada. Gabarito: E (F
-
3 – MPE/SE – Analista do Ministério Público Considere: 16712855225
I. Estrutura de dados que possui uma sequência de células, na qual cada célula contém um objeto de algum tipo e o endereço da célula seguinte. II. Podem ser orientados, regulares, completos e bipartidos e possuir ordem, adjacência e grau. III. Possuem o método de varredura esquerda-raiz-direita (e-r-d). Os itens de I a III descrevem, respectivamente,
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 53 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
a) árvores binárias, listas ligadas e arrays. b) arrays, árvores binárias e listas ligadas. c) grafos, árvores binárias e arrays. d) listas ligadas, grafos e árvores binárias. e) grafos, listas ligadas e árvores binárias. Comentários: (a) Trata-se das Listas Ligadas, visto que falou de sequência, objeto e endereço da célula seguinte; (b) Trata-se dos Grafos, visto que falou dos tipos regular, bipartido, completo e orientado; (c) Trata-se das Árvores Binárias, visto que falou de método de varredura e raiz. Gabarito: D (CESPE 3 – TCE/ES – Analista de Sistemas) Considerando o grafo ilustrado acima, assinale a opção em que é apresentada a descrição em vértices (V) e arestas (A).
a) V = {1, 2, 3, 4, 5, 6 } A = {(2, 4), (2, 3), (2, 5), (3, 6), (1, 5)}
16712855225
b) V = { 2, 4, 1, 3, 6, 5 } A = {(4, 2), (1, 3), (5, 2), (6, 3), (5, 3)} c) V = {1, 2, 3, 4, 5, 6 } A = {(4, 2), (3, 4), (5, 2), (6, 3), (5, 3)} d) V = {1, 2, 3, 4, 5, 6 } A = {(4, 2), (3, 1), (5, 1), (6, 2), (5, 3)} e) V = { 2, 4, 1, 3, 6, 5 }
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 54 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
A = {(4, 2), (3, 1), (5, 2), (6, 3), (5, 3)} Comentários: Galera, os vértices não precisam estar ordenados, logo todos os itens estão corretos. No entanto, as arestas precisam corresponder ao grafo. Vamos por eliminação: (a) A aresta (2,3) não existe; (b) Quase tudo certo, mas a ordem (1,3) está errada – seria (3,1); (c) A aresta (3,4) não existe; (d) A aresta (5,1) não existe; (e) Tudo perfeito! Gabarito: E (CESPE 2 – TJ/RO – Analista de e – ITEM B Grafo corresponde a uma estrutura abstrata de dados que representa um relacionamento entre pares de objetos e que pode armazenar dados em suas arestas e vértices, ou em ambos. Comentários: Fiz uma disciplina na faculdade chamada Teoria dos Grafos! Aquilo era absurdamente complexo, mas para concursos a teoria é beeeem mais tranquila e muito rara de cair. Portanto fiquem tranquilos, bacana? Uma definição de grafo afirma que ele é uma estrutura de dados que consiste em um conjunto de nós (ou vértices) e um conjunto de arcos (ou arestas). Em outras palavras, podemos dizer que é simplesmente um conjunto de pontos e linhas que conectam vários pontos. Ou também que é uma representação abstrata de um conjunto de objetos e das relações existentes entre eles. Uma grande variedade de estruturas do mundo real podem ser representadas abstratamente através de grafos. Professor, pode me ar um exemplo? Claro! 16712855225
Conforme vimos em aula, a definição está perfeita! Gabarito: C (CESPE 2 – PEFOCE – Perito Criminal Considere que um grafo G seja constituído por um conjunto (N) e por uma relação binária (A), tal que G = (N, A), em que os elementos de N são denominados nós (ou vértices) e os elementos de A são denominados arcos (ou arestas). Em face dessas informações e do grafo abaixo, é correto afirmar que esses conjuntos são N = {1,2,3,4} e A = {(1,2),(2,1),(2,4),(2,3)}.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 55 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Comentários: Conforme vimos em aula, a questão está perfeita! Temos quatro nós: N = {1,2,3,4}; e quatro arestas: A = {(1,2),(2,1),(2,4),(2,3)} – observem que a ordenação do grafo ordenado está perfeita. Gabarito: C (CESPE 2 – BASA – Analista de Sistemas É misto o grafo com arestas não dirigidas que representam ruas de dois sentidos e com arestas dirigidas que correspondem a trechos de um único sentido, modelado para representar o mapa de uma cidade cujos vértices sejam os cruzamentos ou finais de ruas e cujas arestas sejam os trechos de ruas sem cruzamentos. Comentários: Um grafo simples é aquele que não contém laços. Um grafo vazio é aquele que contém exclusivamente vértices (não contém arcos). Um grafo misto é aquele que possui arestas dirigidas e não-dirigidas. Um grafo trivial é aquele que possui somente um vértice. Um grafo é denso se contém muitos arcos em relação ao número de vértices e esparso se contém poucos arcos. Como assim, professor? Conforme vimos em aula, um grafo misto é aquele que possui arestas dirigidas e não-dirigidas. O caso citado na questão é um exemplo perfeito e foi retirado integralmente do livro Projeto de algoritmos: Fundamentos, análise e exemplos da internet de Michael T. Goodrich e Roberto Tamassia. 16712855225
Gabarito: C (CESPE 2 – BASA – Analista de Sistemas Para modelar a rede que conecta todos os computadores em uma sala de escritório com a menor metragem possível de cabos, é adequado utilizar um grafo G cujos vértices representem os possíveis pares (u, v) de computadores e cujas arestas representem o comprimento dos cabos necessários para ligar os computadores u e v, determinando-se o caminho mínimo, que contenha todos os vértices de G, a partir de um dado vértice v.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 56 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Comentários: Galera, leiam devagar a questão! Vejam essa parte: “(...) cujos vértices representem os possíveis pares (u,v)”. Vocês, é claro, se lembram do conceito de vértices e arestas. Ora, vértice representa um par de computadores? Não, vértices são os computadores! Quem representa pares são as arestas! Gabarito: E (CESPE - 2012 – BASA – Analista de Sistemas Um grafo completo contém pelo menos um subgrafo ponderado. Comentários: Essa questão não faz o menor sentido! Podemos dizer que um grafo completo contém pelo menos um subgrafo. No entanto, os conceitos de completude e ponderação são completamente independentes. Eu posso ter um grafo completo ponderado ou não; e posso ter um grafo ponderado completo ou não. Gabarito: E (CESPE - 2012 – BASA – Analista de Sistemas) Um grafo não direcionado é dito conectado quando há pelo menos um caminho entre dois vértices quaisquer do grafo. Comentários: Um grafo é dito conexo ou conectado quando existir pelo menos um caminho entre cada par de vértices. Caso contrário, ele será dito desconexo, isto é, se há pelo menos um par de vértices que não esteja ligado a nenhuma cadeia (caminho). Vejam a imagem do grafo que eu desenhei lá em cima! Ele é conexo ou desconexo? Ele é desconexo, há um par de vértices (E,F) que não está ligado a nenhum caminho. 16712855225
Conforme vimos em aula, a questão comete um minúsculo deslize! Seria mais correto dizer que um grafo não direcionado é dito conectado quando sempre há pelo menos um caminho entre dois vértices quaisquer do grafo. Por que, professor? Vejam o grafo que eu desenhei na teoria dessa aula. Pela definição da questão, ele é conectado quando há pelo menos um caminho entre dois vértices quaisquer do grafo. Vamos pegar dois vértices quaisquer? Sim, Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 57 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
vamos pegar o par A-C! Há pelo menos um caminho entre eles? Sim, logo podemos dizer – por essa definição – que ele é conectado. No entanto, o par D-E não possui um caminho entre eles, mas a definição da questão não disse para verificar todos os pares de vértices. Entenderam a sutileza? Portanto, seria ideal dizer que ele é conectado quando há pelo menos um caminho entre cada par de vértices do grafo. Dessa forma, cobrimos todos os pares. É tão sutil que nem eu havia percebido – quem me alertou foi um aluno. Gabarito: C 10. (CESPE - 2012 – TJ/AC – Analista de Sistemas) Define-se um grafo como fortemente conexo se todos os nós puderem ser atingidos a partir de qualquer outro nó. Comentários: Se o grafo for direcionado/orientado, um grafo é dito fortemente conexo se existir um caminho de A B e de B A, para cada par (A,B) de vértices de um grafo. Em outras palavras, o grafo é fortemente conexo se cada par de vértices participa de um circuito. Isto significa que cada vértice pode ser alcançável partindo-se de qualquer outro vértice do grafo. Conforme vimos em aula, a questão está perfeita! Gabarito: C 16712855225
3 – CRPM – Analista de Sistemas) Considere que o grafo não 11. (CESPE orientado representado na figura abaixo possua as seguintes características: G1 = (V1, A1) V1 = {A, B, C, D} A1 = {(A, C), (A, D), (B, C), (B, D), (A,B)}.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 58 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
Nesse caso, é correto afirmar que o grafo G1 possui quatro vértices, nomeados de A, B, C e D, e cinco arcos, que conectam pares de vértices, conforme especificado em A1. Comentários: A questão está quase perfeita, mas ela possui um deslize: não existe a aresta (A,B) – seria (C,D). Gabarito: E 12. (CESPE - 2012 – BASA – Analista de Sistemas) A implementação de um grafo do tipo ponderado e direcionado na forma de uma matriz de adjacência utiliza menor quantidade de memória que a implementação desse mesmo grafo na forma de uma lista encadeada. Comentários: Pensem comigo! Para um grafo com uma Matriz de Adjacência esparsa (não densa), uma representação de Lista de Adjacências do grafo ocupa menos espaço, porque ele não usa nenhum espaço para representar as arestas que não estão presentes. Lembram-se da lista? Nós só representamos os nós adjacentes, em contraste com a Matriz de Adjacência. No entanto, quanto mais denso, isso pode mudar. Conforme vimos em aula, para grafos esparsos (não densos), a Lista de Adjacência (que é uma lista encadeada) ocupa menos espaço em memória, na medida em que não necessita representar vértices não adjacentes – diferente da Matriz de Adjacência. 16712855225
Gabarito: E 13. (CESGRANRIO 4 – BASA – Analista de Sistemas) O grafo acima pode ser representado pela seguinte matriz:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 59 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
a)
b)
c)
d)
e)
Comentários: Vamos ver se vocês se lembram! O vértice A11 tem ser 0, porque não há uma aresta do Nó 1 para o Nó 1. O vértice A12 tem ser 1, porque há uma aresta do Nó 1 para o Nó 2. O vértice A13 tem ser 0, porque não há uma aresta do Nó 1 para o Nó 3. O vértice A14 tem ser 1, porque há uma aresta do Nó 1 para o Nó 4. O vértice A 15 tem ser 0, porque não há uma aresta do Nó 1 para o Nó 5. Logo, a primeira linha deve ser: 0, 1, 0, 1, 0. Eliminamos todos os itens, exceto os dois primeiros. Vamos pegar um vértice específico agora para descobrir qual está certo. Observem o vértice A23 e percebam que ele deve ser 1, porque existe uma aresta do Nó 2 para o Nó 3. Descobrimos a resposta! 16712855225
Gabarito: A
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 60 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
14. (CESPE - 2012 – TJ/SE – Analista de Sistemas) Um grafo é formado por um par de conjuntos de vértices e arestas, não podendo o conjunto de vértices ser particionado em subconjuntos. Comentários: Podem, sim. O nome disso é: Grafo Bipartido! Um grafo é dito ser bipartido quando seu conjunto de vértices V puder ser particionado em dois subconjuntos V 1 e V2. Portanto não há óbice quanto ao particionamento de um conjunto de vértices em subconjuntos. Gabarito: E 15. (CESPE - 2012 – TRT/AM – Analista de Sistemas) Um grafo é uma estrutura de dados consistida em um conjunto de nós (ou vértices) e um conjunto de arcos (ou arestas). O grafo em que os arcos possuem um número ou peso associados a eles, é chamado de grafo: a) predecessor. b) adjacente. c) incidente. d) ponderado. e) orientado. Comentários: Vamos ver agora alguns conceitos importantes! Um grafo pode ser dirigido – também chamado direcionado, orientado ou dígrafo –, se as arestas tiverem uma direção (imagem da esquerda), ou não dirigido, se as arestas não tiverem direção (imagem central). Se as arestas tiverem associado um peso ou custo, o grafo a a ser chamado ponderado, valorado ou pesado (imagem da direita). 16712855225
Conforme vimos em aula, um grafo com arcos numerados ou com peso são chamados Grafos Ponderados ou Grafos Valorados ou Grafos Pesados. Gabarito: D ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 61 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00 HASHING
As Tabelas de Dispersão, também conhecidas como Tabelas de Espelhamento ou Tabelas Hashing, armazenam uma coleção de valores, sendo que cada valor está associado a uma chave. Tais chaves têm que ser todas distintas e são usadas para mapear os valores na tabela. Esse mapeamento é feito por uma função de hashing que chamaremos de h. Por exemplo, podemos implementar uma tabela de dispersão usando um vetor com oito posições e utilizar h(x) = x MOD 8 como função de hashing5. Dizemos que h(k) é a posição original da chave k e é nessa posição da tabela que a chave k deve ser inserida. A imagem abaixo ilustra a inserção de uma coleção de valores com suas respectivas chaves numa Tabela de Dispersão. Observe que o valor Gil foi colocado na posição 7 da tabela, pois a chave associada a Gil é 31 e h(31) = 7. O que aconteceria se tratássemos de inserir nessa tabela o valor Ivo com chave 33? Observe que h(33) = 1, mas a posição 1 da tabela já está ocupada. Dizemos que as chaves 25 e 33 colidiram. Mais precisamente, duas chaves x e y colidem se h(x) = h(y). Note que o problema da colisão de chaves ocorre porque, na maioria dos casos, o domínio das chaves é maior que a quantidade de posições da tabela. Sendo assim, pelo princípio da casa de pombos, qualquer função do conjunto das chaves para o conjunto das posições da tabela não é injetora. 16712855225
Não é aceitável recusar a inserção de uma chave que colida com outra já existente na tabela se ela ainda tiver posições livres. Precisamos de alguma estratégia para lidar com as colisões de chaves. Há diversas técnicas para lidar com as colisões, tais como Hashing Fechado ou Hashing Aberto. O Método de Hashing é recomendado para um grande número de dados que possuam faixas de valores variáveis.
5
Galera... o MOD representa o resto de uma divisão. Ex: 10 mod 8 = 2, porque 10/8 possui quociente 1 e resto 2. Em outras palavras, 8*1 + 2 = 10.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 62 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - istração de Dados A pesquisa sequencial é aplicável em estruturas não ordenadas. Comentários: Perfeito! Para fazer uma pesquisa sequencial, não é necessário que os dados estejam ordenados – diferentemente da pesquisa binária. Gabarito: C (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) As colisões ocorrem na utilização de tabela hash porque várias chaves podem resultar na mesma posição. Comentários: Perfeito! É raro, mas acontece... Gabarito: C (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - istração de Dados) Ocorre o hashing quando não há o armazenamento de cada entrada de uma tabela em um específico endereço calculado a partir da aplicação de uma função chave da entrada. 16712855225
Comentários: Pelo contrário, ocorre o hashing quando há o armazenamento de cada entrada de uma tabela em um específico endereço calculado a partir da aplicação de uma função chave da entrada. Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 63 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(FCC - METRÔ- - Analista Treinee - Análise de Sistemas) O objetivo de fazer uma busca rápida a partir de uma chave de pesquisa simples e obter o valor desejado é alcançado pela estrutura de dados especial denominada: a) array. b) lista. c) vetor. d) árvore binária. e) tabela de hashing. Comentários: Trata-se da Tabela de Hashing! Gabarito: E (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados A busca que utiliza uma tabela hash realiza comparação das chaves para encontrar a posição do elemento que está sendo buscado. Comentários: Não, eles utilizam a chave para gerar resultados que, esses sim, são comparados. Gabarito: E (CESPE - 2010 - DETRAN-ES - Analista de Sistemas No método de hashing, por meio de o sequencial, são utilizados tabelas e mapas para recuperar informações de endereço de arquivos de forma rápida e eficiente. 16712855225
Comentários: Não, Método de Hashing não faz o Sequencial. Gabarito: E ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 64 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
ESTRUTURA DE ARQUIVOS É senso comum que há a necessidade de salvar ou guardar nossos dados ou programas. E onde podemos fazer isso? Em geral, em dispositivos persistentes (Discos, PenDrive, Fitas, etc). O armazenamento de pequenos volumes de dados, via de regra, não encerra grandes problemas no que diz respeito à distribuição dos registros dentro de um arquivo. À medida que cresce o volume de dados, a frequência ou a complexidade dos os, crescem também os problemas de eficiência do armazenamento dos arquivos e do o a seus registros, sendo a sofisticação das técnicas de armazenamento e recuperação de dados uma consequência da necessidade de o rápido a grandes arquivos ou arquivos muito solicitados. A maneira intuitiva de armazenar um arquivo consiste na distribuição dos seus registros em uma ordem arbitrária, um após o outro, dentro da área destinada. Esta ordem pode ser, por exemplo, aquela na qual os registros são gerados, causando dificuldade na localização e perda de eficiência, mas esta técnica é bastante usada, principalmente durante as fases preliminares da geração de um arquivo. Quando escrevemos um programa para gerar um arquivo de dados, costumamos agrupar os campos que fornecem informações sobre um mesmo indivíduo em um registro. Um arquivo é formado por uma coleção de registros lógicos, cada um deles representando um objeto ou entidade. E o que seria um registro lógico? É uma sequência de itens, sendo cada item chamado campo ou atributo. Cada item corresponde a uma característica ou propriedade do objeto representado. Existem três formas de ar arquivos: sequencial, direta ou indexado. No primeiro caso, os registros são lidos em sequência, um após o outro. A cada registro lido o indicador de posição de arquivo é avançado para que a próxima leitura ocorra iniciando naquele ponto. 16712855225
No segundo caso, pode-se ar qualquer posição do arquivo, para tanto é necessário preciso ajustar o indicador de posição do arquivo para onde deseja-se realizar uma operação de leitura/escrita. No terceiro caso, o arquivo é visto como um conjunto de registros indexados por uma chave. Bem, não encontrei uma questão sequer sobre esse assunto.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 65 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 66 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) ESTRUTURAS DE DADOS (FGV – 2015 – DPE/ – Analista de Sistemas) No desenvolvimento de sistemas, a escolha de estruturas de dados em memória é especialmente relevante. Dentre outras classificações, é possível agrupar essas estruturas em lineares e não lineares, conforme a quantidade de sucessores e antecessores que os elementos da estrutura possam ter. Assinale a opção que apresenta, respectivamente, estruturas de dados lineares e não lineares. a) Tabela de dispersão e fila. b) Estrutura de seleção e pilha. c) Pilha e estrutura de seleção. d) Pilha e árvore binária de busca. e) Fila e pilha. (CESPE – 2010 – DETRAN/ES – Analista de Sistemas) Um tipo abstrato de dados apresenta uma parte destinada à implementação e outra à especificação. Na primeira, são descritas, em forma sintática e semântica, as operações que podem ser realizadas; na segunda, os objetos e as operações são representados por meio de representação, operação e inicialização. (CESPE – 2010 – TRT/RN – Analista de Sistemas) O tipo abstrato de dados consiste em um modelo matemático (v,o), em que v é um conjunto de valores e o é um conjunto de operações que podem ser realizadas sobre valores. (CESPE – 2010 – BASA – Analista de Sistemas) A escolha de estruturas internas de dados utilizados por um programa pode ser organizada a partir de TADs que definem classes de objetos com características distintas. 16712855225
(CESPE – 2010 – BASA – Analista de Sistemas) A descrição dos parâmetros das operações e os efeitos da ativação das operações representam, respectivamente, os níveis sintático e semântico em que ocorre a especificação dos TDAs. (FCC – 2010 – TRE/AM – Analista de Sistemas) Em relação aos tipos abstratos de dados - TAD, é correto afirmar:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 67 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
a) O TAD não encapsula a estrutura de dados para permitir que os usuários possam ter o a todas as operações sobre esses dados. b) Na transferência de dados de uma pilha para outra, não é necessário saber como a pilha é efetivamente implementada. c) Alterações na implementação de um TAD implicam em alterações em seu uso. d) Um programador pode alterar os dados armazenados, mesmo que não tenha conhecimento de sua implementação. e) TAD é um tipo de dados que esconde a sua implementação de quem o manipula. (FCC – – TRE/PI – Analista de Sistemas) Em relação a tipos abstratos de dados, é correto afirmar que: a) o TAD não encapsula a estrutura de dados para permitir que os usuários possam ter o a todas as operações disponibilizadas sobre esses dados. b) algumas pilhas item serem declaradas como tipos abstratos de dados. c) filas não permitem declaração como tipos abstratos de dados. d) os tipos abstratos de dados podem ser formados pela união de tipos de dados primitivos, mas não por outros tipos abstratos de dados. e) são tipos de dados que escondem a sua implementação de quem o manipula; de maneira geral as operações sobre estes dados são executadas sem que se saiba como isso é feito. 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 68 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) VETORES E MATRIZES (FCC - 2009 - - - Analista Judiciário - Tecnologia da Informação Considere uma estrutura de dados do tipo vetor. Com respeito a tal estrutura, é correto que seus componentes são, característicamente, a) heterogêneos e com o FIFO. b) heterogêneos e com o LIFO. c) heterogêneos e com o indexado-sequencial. d) homogêneos e o não indexado. e) homogêneos e de o aleatório por intermédio de índices. (CETAP - 2010 - - - Analista de Sistemas Matrizes são estruturas de dados de n-dimensões. Por simplicidade, chamaremos de matrizes as matrizes bidimensionais numéricas (que armazenam números inteiros). Sendo assim, marque a alternativa INCORRETA. a) Uma matriz de m linhas e n colunas contêm (m * n) dados. b) Uma matriz pode ser representada utilizando listas ligadas. c) A soma dos elementos de uma matriz pode ser calculada fazendo dois laços aninhados, um sobre as linhas e o outro sobre as colunas. d) A soma de duas matrizes de m linhas e n colunas resulta em uma matriz de 2*m linhas e 2*n colunas. 16712855225
e) O produto de duas matrizes de n linhas e n colunas resulta em uma matriz de n linhas e n colunas. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Arquitetura de Tecnologia Os dados armazenados em uma estrutura do tipo matriz não podem ser ados de maneira aleatória. Portanto, usa-se normalmente uma matriz quando o volume de inserção e remoção de dados é maior que o volume de leitura dos elementos armazenados.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 69 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação Entre alguns tipos de estrutura de dados, podem ser citados os vetores, as pilhas e as filas. (CESPE - 2011 - EBC - Analista - Engenharia de Software Vetores são utilizados quando estruturas indexadas necessitam de mais que um índice para identificar um de seus elementos. (CESPE - 2010 - TRE-BA - Analista Judiciário - Análise de Sistemas) Vetores podem ser considerados como listas de informações armazenadas em posição contígua na memória. (CESPE - 2010 - TRE-BA - Analista Judiciário - Análise de Sistemas Uma posição específica de um vetor pode ser ada diretamente por meio de seu índice.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 70 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) LISTA ENCADEADA (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) O tempo de busca de um elemento em uma lista duplamente encadeada é igual à metade do tempo da busca de um elemento em uma lista simplesmente encadeada. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) Em algumas implementações, uma lista vazia pode ter um único nó, chamado de sentinela, nó cabeça ou header. Entre suas possíveis funções, incluise simplificar a implementação de algumas operações realizadas sobre a lista, como inserir novos dados, recuperar o tamanho da lista, entre outras. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) Estruturas ligadas como listas encadeadas superam a limitação das matrizes que não podem alterar seu tamanho inicial. (CESPE - 2012 - nco da Amazônia - Técnico Científico - istração de Dados) As listas duplamente encadeadas diferenciam-se das listas simplesmente encadeadas pelo fato de, na primeira, os nós da lista formarem um anel com o último elemento ligado ao primeiro da lista. (FCC - 2012 - TRE- - Analista Judiciário - Análise de Sistemas - E) Numa lista singularmente encadeada, para ar o último nodo é necessário partir do primeiro e ir seguindo os campos de ligação até chegar ao final da lista. 16712855225
(CESPE - 2011 - EBC - alista - Engenharia de Software) Uma lista é uma coleção de elementos do mesmo tipo dispostos linearmente, que podem ou não seguir determinada organização. As listas podem ser dos seguintes tipos: de encadeamento simples, duplamente encadeadas e ordenadas. (CESPE - ANAC - Técnico istrativo - Informática) Em uma lista circular duplamente encadeada, cada nó aponta para dois outros nós da lista, um anterior e um posterior.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 71 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
(CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação) A principal característica de uma lista encadeada é o fato de o último elemento da lista apontar para o elemento imediatamente anterior. (CESPE - TCE-AC - Analista de Controle Externo - Processamentos de Dados) Uma lista encadeada é uma coleção de nodos que, juntos, formam uma ordem linear. Se é possível os nodos se deslocarem em ambas as direções na lista, diz-se que se trata de uma lista simplesmente encadeada. 10. (CESPE - 2008 – HEMOBRÁS – Técnico de Informática) Uma estrutura do tipo lista, em que é desejável percorrer o seu conteúdo nas duas direções indiferentemente, é denominado lista duplamente encadeada. 11. (CESPE - 2010 – TRE/MT – Analista de Sistemas – C) Uma lista duplamente encadeada é uma lista em que o seu último elemento referencia o primeiro. 12. (CESPE - 2006 – SGA/AC – Analista de Sistemas) O principal problema da alocação por lista encadeada é a fragmentação. 13. (CESPE – MCT – Analista de Sistemas) O armazenamento de arquivos em disco pode ser feito por meio de uma lista encadeada, em que os blocos de disco são ligados por ponteiros. A utilização de lista encadeada elimina completamente o problema de fragmentação interna. 14. (CESPE – FINEP – Analista de Sistemas) Uma lista encadeada é uma representação de objetos na memória do computador que consiste de uma sequência de células em que: a) cada célula contém apenas o endereço da célula seguinte. 16712855225
b) cada célula contém um objeto e o tipo de dados da célula seguinte. c) o último elemento da sequência aponta para o próximo objeto que normalmente possui o endereço físico como not null. d) cada célula contém um objeto de algum tipo e o endereço da célula seguinte. e) a primeira célula contém o endereço da última célula.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 72 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
15. (CESPE - 2010 – BASA – Analista de Sistemas) Em uma lista encadeada, o tempo de o a qualquer um de seus elementos é constante e independente do tamanho da estrutura de dados. 16. (CESPE - 2010 – INMETRO – Analista de Sistemas – C) Considere que Roberto tenha feito uso de uma lista encadeada simples para programar o armazenamento e o posterior o aos dados acerca dos equipamentos instalados em sua empresa. Considere, ainda, que, após realizar uma consulta acerca do equipamento X, Roberto precisou ar outro equipamento Y que se encontrava, nessa lista, em posição anterior ao equipamento X. Nessa situação, pela forma como os ponteiros são implementados em uma lista encadeada simples, o algoritmo usado por Roberto realizou a consulta ao equipamento Y sem reiniciar a pesquisa do começo da lista. 17. (FCC – TRE/AM – Analista de Sistemas) Os dados contidos em uma lista encadeada estão: a) b) c) d) e)
ordenados seqüencialmente. sem ordem lógica ou física alguma. em ordem física e não, necessariamente, em ordem lógica. em ordem lógica e, necessariamente, em ordem física. em ordem lógica e não, necessariamente, em ordem física.
18. (FCC - 2010 – DPE/SP – Analista de Sistemas) Uma estrutura de dados que possui três campos: dois ponteiros e campo de informação denomina-se: a) b) c) d) e)
lista encadeada dupla. Lista encadeada simples. pilha. fila. vetor.
16712855225
19. (CESPE - 2010 – TRE/MT – Analista de Sistemas) O algoritmo para inclusão de elementos em uma pilha é usado sem nenhuma alteração para incluir elementos em uma lista.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 73 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) PILHAS (CESPE - 2011 - FUB - Analista de Tecnologia da Informação - Específicos) As pilhas são listas encadeadas cujos elementos são retirados e acrescentados sempre ao final, enquanto as filas são listas encadeadas cujos elementos são retirados e acrescentados sempre no início. (CESPE - 2013 - INPI - Analista de Planejamento - Desenvolvimento e Manutenção de Sistemas) Na estrutura de dados do tipo lista, todo elemento novo que é introduzido na pilha torna-se o elemento do topo. (CESPE - 2012 - -RO - Analista Judiciário - Analista de Sistemas e – E) Visitas a sítios armazenadas em um navegador na ordem last-in-first-out é um exemplo de lista. (ESAF - 2013 - DNIT - Analista istrativo - Tecnologia da Informação) Assinale a opção correta relativa às operações básicas adas por pilhas. a) Push: insere um novo elemento no final da pilha. b) Pop: adiciona elementos ao topo da pilha. c) Pull: insere um novo elemento no interior da pilha. d) Top: transfere o último elemento para o topo da pilha. e) Top: a o elemento posicionado no topo da pilha. (FCC - 2012 – TST - Analista de Sistemas – C) As pilhas e as filas são estruturas de dados essenciais para os sistemas computacionais. É correto afirmar que a pilha é conhecida como lista FIFO - First In First Out. 16712855225
(FCC - 2012 – TRE/CE - Analista de Sistemas) Sobre pilhas é correto afirmar: a) Uma lista LIFO (Last-In/First-Out) é uma estrutura estática, ou seja, é uma coleção que não pode aumentar e diminuir durante sua existência. b) Os elementos na pilha são sempre removidos na mesma ordem em que foram inseridos.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 74 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
c) Uma pilha a apenas duas operações básicas, tradicionalmente denominadas push (insere um novo elemento no topo da pilha) e pop (remove um elemento do topo da pilha). d) Cada vez que um novo elemento deve ser inserido na pilha, ele é colocado no seu topo e, em qualquer momento, apenas aquele posicionado no topo da pilha pode ser removido. e) Sendo P uma pilha e x um elemento qualquer, a operação Push(P,x) diminui o tamanho da pilha P, removendo o elemento x do seu topo. (CESPE - 2011 - EBC - Analista - Engenharia de Software) As pilhas, também conhecidas como listas LIFO ou PEPS, são listas lineares em que todas as operações de inserção e remoção de elementos são feitas por um único extremo da lista, denominado topo. (VUNESP - 2011 - TJM- - Analista de Sistemas - Judiciário) Lista do tipo LIFO (Last in, First Out) e lista do tipo FIFO (Firstin,First Out) são, respectivamente, características das estruturas de dados denominadas: a) Fila e Pilha. b) Pilha e Fila. c) Grafo e Árvore. d) Árvore e Grafo. e) Árvore Binária e Árvore Ternária. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Arquitetura de Tecnologia) A definição da estrutura pilha permite a inserção e a eliminação de itens, de modo que uma pilha é um objeto dinâmico, cujo tamanho pode variar constantemente. 16712855225
10. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - istração de Dados) Na representação física de uma pilha sequencial, é necessário uso de uma variável ponteiro externa que indique a extremidade da lista linear onde ocorrem as operações de inserção e retirada de nós. 11. (CESPE - ANAC - Técnico istrativo - Informática) As operações de inserir e retirar sempre afetam a base de uma pilha.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 75 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
12. (FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação) Pilha é uma estrutura de dados: a) cujo o aos seus elementos segue tanto a lógica LIFO quanto a FIFO. b) cujo o aos seus elementos ocorre de forma aleatória. c) que pode ser implementada somente por meio de vetores. d) que pode ser implementada somente por meio de listas. e) cujo o aos seus elementos segue a lógica LIFO, apenas. 13. (CESPE - 04 – STJ – Analista de Sistemas Em geral, em uma pilha só se ite ter o ao elemento localizado em seu topo. Isso se adapta perfeitamente à característica das seqüências em que só o primeiro componente é diretamente ível. 14. (CESPE - 2004 – STJ – Analista de Sistemas) A seguir, está representada corretamente uma operação de desempilhamento em uma pilha de nome p. se p.topo = 0 então nada {pilha vazia} senão p.topo p.topo-1 15. (CESPE - 2010 – TRE/MT - Analista de Sistemas – A) O tipo nó é inadequado para implementar estruturas de dados do tipo pilha. 16. (FGV – 2015 – DPE/ – Analista de Sistemas) Assinale a opção que apresenta a estrutura de dados na qual o primeiro elemento inserido é o último a ser removido. 16712855225
a) Árvore b) Fila c) Pilha d) Grafo e) Tabela de dispersão
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 76 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) FILAS (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - Análise de Sistemas) Em um programa existe a necessidade de guardar todas as alterações feitas em determinado dado para que seja possível desfazer alterações feitas ao longo de toda a sua existência. Nessa situação, a estrutura de dados mais adequada para o armazenamento de todas as alterações citadas seria uma fila. (CESPE - 2012 – TST – Analista de Sistemas – A) As pilhas e as filas são estruturas de dados essenciais para os sistemas computacionais. É correto afirmar que a fila é conhecida como lista LIFO - Last In First Out. (CESPE - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas) As filas são estruturas com base no princípio LIFO (last in, first out), no qual os dados que forem inseridos primeiro na fila serão os últimos a serem removidos. Existem duas funções que se aplicam a todas as filas: PUSH, que insere um dado no topo da fila, e POP, que remove o item no topo da fila. (FCC - 2012 - MPE-AP – Analista de Sistemas - A) Nas estruturas de dados, devido às características das operações da fila, o primeiro elemento a ser inserido será o último a ser retirado. Estruturas desse tipo são conhecidas como LIFO. (FCC - 2012 - MPE-AP – Analista de Sistemas - C) Nas estruturas de dados, a fila é uma lista linear na qual as operações de inserção e retirada ocorrem apenas no início da lista. 16712855225
(FCC - 2012 - TRE- - Analista Judiciário - Análise de Sistemas – D) Pela definição de fila, se os elementos são inseridos por um extremo da lista linear, eles só podem ser removidos pelo outro. (FCC - 2011 - TRT - 19ª Região (AL) - Analista Judiciário - Tecnologia da Informação) FIFO refere-se a estruturas de dados do tipo: a) fila. b) árvore binária. c) pilha.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 77 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
d) matriz quadrada. e) cubo. (ESAF - 2010 - CVM - Analista de Sistemas - prova 2) Uma fila é um tipo de lista linear em que: a) as inserções são realizadas em um extremo e as remoções no outro extremo. b) as inserções e remoções são realizadas em um mesmo extremo. c) podem ser realizadas apenas inserções. d) a inserção de um elemento requer a remoção de outro elemento. e) a ordem de saída não corresponde à ordem de entrada dos elementos. (CESPE - 2010 - DETRAN-ES alista de Sistemas) No armazenamento de dados pelo método FIFO (first in - first out), a estrutura de dados é representada por uma fila, em cuja posição final ocorrem inserções e, na inicial, retiradas. 10. (CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação) Entre alguns tipos de estrutura de dados, podem ser citados os vetores, as pilhas e as filas. 11. (CESPE - 2004 – SES/PA – Analista de Sistemas) Uma estrutura mais geral que as pilhas e filas é o deque, em que as inserções, retiradas e os são permitidos em ambas as extremidades. 12. (CESPE – TCE/AC – Analista de Sistemas – D) Um deque (double ended queue) requer inserção e remoção no topo de uma lista e permite a implementação de filas com algum tipo de prioridade. A implementação de um deque, geralmente é realizada com a utilização de uma lista simplesmente encadeada. 16712855225
13. (FCC - 2007 – TRT/23 – Analista de Sistemas) Uma estrutura de dados com vocação de FIFO de duplo fim e que ite a rápida inserção e remoção em ambos os extremos é: a) b) c) d) e)
uma pilha. uma splay tree. um deque. uma lista linear. uma árvore AVL.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 78 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
14. (CESPE - 2004 – PBV/RR - Analista de Sistemas) As filas com prioridade são listas lineares nas quais os elementos são pares da forma (qi, pi), em que q é o elemento do tipo base e p é uma prioridade. Elas possuem uma política de fila do tipo FIFO (first in first out) entre os elementos de mesma prioridade. 15. (CESPE - 2004 – STJ – Analista de Sistemas) A seguir, está representada corretamente uma operação de retirada em uma fila de nome f. se f.começo = nil então erro {fila vazia} senão j f.começo.info
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 79 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (CESPE) ÁRVORES (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) As operações de busca em uma árvore binária não a alteram, enquanto operações de inserção e remoção de nós provocam mudanças sistemáticas na árvore. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) O tipo de dados árvore representa organizações hierárquicas entre dados. (CESPE - 2010 - DETRAN-ES - Analista de Sistemas) Denomina-se árvore binária a que possui apenas dois nós. (CESPE - ANAC - Especialista em Regulação - Economia) Considerandose uma árvore binária completa até o nível 5, então a quantidade de folhas nesse nível será 24. (CESPE – ANAC - Analista de Sistemas) Uma árvore binária completa até o nível 10 tem 2.047 nós. (CESPE - 2010 – TRE/MT – Analista de Sistemas – B) As listas, pilhas, filas e árvores são estruturas de dados que têm como principal característica a sequencialidade dos seus elementos. (CESPE - 2010 – TRE/MT - Analista de Sistemas – E) O uso de recursividade é totalmente inadequado na implementação de operações para manipular elementos de uma estrutura de dados do tipo árvore. 16712855225
(CESPE - 2011 – STM – Analista de Sistemas) Enquanto uma lista encadeada somente pode ser percorrida de um único modo, uma árvore binária pode ser percorrida de muitas maneiras diferentes.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 80 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (FCC) ÁRVORES - 2012 - MPE-AP - Analista Ministerial - Tecnologia da Informação – A) A árvore é uma estrutura linear que permite representar uma relação de hierarquia. Ela possui um nó raiz e subárvores não vazias. (FCC - 2011 - TRT - 19ª Região (AL) - Técnico Judiciário - Tecnologia da Informação) Em uma árvore binária, todos os nós têm grau: a) 2. b) 0, 1 ou 2. c) divisível por 2. d) maior ou igual a 2. e) 0 ou 1.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 81 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) ÁRVORES (CETAP - 2010 - - - Analista de Sistemas - A) Uma árvore binária é aquela que tem como conteúdo somente valores binários. (CETAP - 2010 - - - Analista de Sistemas - B) Uma árvore é composta por duas raízes, sendo uma principal e a outra secundária. (FUNCAB - 2010 - SEJUS-R - Analista de Sistemas - II) Árvores são estruturas de dados estáticas com sua raiz representada no nível um.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 82 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) GRAFOS (CESPE - 2010 – TJ/ES – Analista de e Considerando-se a implementação de um grafo denso, direcionado e ponderado, se o número de vértices ao quadrado tem valor próximo ao número de arcos, o uso de uma matriz de adjacência simétrica apresenta vantagens em relação ao uso de uma lista de adjacência. (FCC -
3 – MPE/SE – Analista do Ministério Público Considere:
I. Estrutura de dados que possui uma sequência de células, na qual cada célula contém um objeto de algum tipo e o endereço da célula seguinte. II. Podem ser orientados, regulares, completos e bipartidos e possuir ordem, adjacência e grau. III. Possuem o método de varredura esquerda-raiz-direita (e-r-d). Os itens de I a III descrevem, respectivamente, a) árvores binárias, listas ligadas e arrays. b) arrays, árvores binárias e listas ligadas. c) grafos, árvores binárias e arrays. d) listas ligadas, grafos e árvores binárias. e) grafos, listas ligadas e árvores binárias. (CESPE 3 – TCE/ES – Analista de Sistemas) Considerando o grafo ilustrado acima, assinale a opção em que é apresentada a descrição em vértices (V) e arestas (A). 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 83 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
a) V = {1, 2, 3, 4, 5, 6 } A = {(2, 4), (2, 3), (2, 5), (3, 6), (1, 5)} b) V = { 2, 4, 1, 3, 6, 5 } A = {(4, 2), (1, 3), (5, 2), (6, 3), (5, 3)} c) V = {1, 2, 3, 4, 5, 6 } A = {(4, 2), (3, 4), (5, 2), (6, 3), (5, 3)} d) V = {1, 2, 3, 4, 5, 6 } A = {(4, 2), (3, 1), (5, 1), (6, 2), (5, 3)} e) V = { 2, 4, 1, 3, 6, 5 } A = {(4, 2), (3, 1), (5, 2), (6, 3), (5, 3)} (CESPE 2 – TJ/RO – Analista de e – ITEM B Grafo corresponde a uma estrutura abstrata de dados que representa um relacionamento entre pares de objetos e que pode armazenar dados em suas arestas e vértices, ou em ambos. (CESPE 2 – PEFOCE – Perito Criminal Considere que um grafo G seja constituído por um conjunto (N) e por uma relação binária (A), tal que G = (N, A), em que os elementos de N são denominados nós (ou vértices) e os elementos de A são denominados arcos (ou arestas). Em face dessas informações e do grafo abaixo, é correto afirmar que esses conjuntos são N = {1,2,3,4} e A = {(1,2),(2,1),(2,4),(2,3)}.
16712855225
(CESPE 2 – BASA – Analista de Sistemas É misto o grafo com arestas não dirigidas que representam ruas de dois sentidos e com arestas dirigidas que correspondem a trechos de um único sentido, modelado para representar o mapa de uma cidade cujos vértices sejam os cruzamentos ou finais de ruas e cujas arestas sejam os trechos de ruas sem cruzamentos. (CESPE 2 – BASA – Analista de Sistemas Para modelar a rede que conecta todos os computadores em uma sala de escritório com a menor metragem possível de cabos, é adequado utilizar um grafo G cujos vértices representem os possíveis pares (u, v) de computadores e cujas arestas representem o Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 84 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
comprimento dos cabos necessários para ligar os computadores u e v, determinando-se o caminho mínimo, que contenha todos os vértices de G, a partir de um dado vértice v. (CESPE - 2012 – BASA – Analista de Sistemas Um grafo completo contém pelo menos um subgrafo ponderado. (CESPE - 2012 – BASA – Analista de Sistemas) Um grafo não direcionado é dito conectado quando há pelo menos um caminho entre dois vértices quaisquer do grafo. 10. (CESPE - 2012 – TJ/AC – Analista de Sistemas) Define-se um grafo como fortemente conexo se todos os nós puderem ser atingidos a partir de qualquer outro nó. 11. (CESPE 3 – CRPM – Analista de Sistemas) Considere que o grafo não orientado representado na figura abaixo possua as seguintes características: G1 = (V1, A1) V1 = {A, B, C, D} A1 = {(A, C), (A, D), (B, C), (B, D), (A,B)}.
Nesse caso, é correto afirmar que o grafo G1 possui quatro vértices, nomeados de A, B, C e D, e cinco arcos, que conectam pares de vértices, conforme especificado em A1. 16712855225
12. (CESPE - 2012 – BASA – Analista de Sistemas) A implementação de um grafo do tipo ponderado e direcionado na forma de uma matriz de adjacência utiliza menor quantidade de memória que a implementação desse mesmo grafo na forma de uma lista encadeada. 13. (CESGRANRIO 4 – BASA – Analista de Sistemas) O grafo acima pode ser representado pela seguinte matriz:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 85 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
a)
b)
c)
d)
e)
14. (CESPE - 2012 – TJ/SE – Analista de Sistemas) Um grafo é formado por um par de conjuntos de vértices e arestas, não podendo o conjunto de vértices ser particionado em subconjuntos. 16712855225
15. (CESPE - 2012 – TRT/AM – Analista de Sistemas) Um grafo é uma estrutura de dados consistida em um conjunto de nós (ou vértices) e um conjunto de arcos (ou arestas). O grafo em que os arcos possuem um número ou peso associados a eles, é chamado de grafo: a) predecessor. b) adjacente. c) incidente.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 86 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
d) ponderado. e) orientado.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 87 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) HASHING (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - istração de Dados A pesquisa sequencial é aplicável em estruturas não ordenadas. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados) As colisões ocorrem na utilização de tabela hash porque várias chaves podem resultar na mesma posição. (CESPE - 2010 - Banco da Amazônia - Técnico Científico - Tecnologia da Informação - istração de Dados) Ocorre o hashing quando não há o armazenamento de cada entrada de uma tabela em um específico endereço calculado a partir da aplicação de uma função chave da entrada. (FCC - METRÔ- - Analista Treinee - Análise de Sistemas) O objetivo de fazer uma busca rápida a partir de uma chave de pesquisa simples e obter o valor desejado é alcançado pela estrutura de dados especial denominada: a) array. b) lista. c) vetor. d) árvore binária. e) tabela de hashing. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - istração de Dados A busca que utiliza uma tabela hash realiza comparação das chaves para encontrar a posição do elemento que está sendo buscado. 16712855225
(CESPE - 2010 - DETRAN-ES - Analista de Sistemas No método de hashing, por meio de o sequencial, são utilizados tabelas e mapas para recuperar informações de endereço de arquivos de forma rápida e eficiente.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 88 de 91
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) ESTRUTURAS DE DADOS 1 D
2 E
3 C
4 E
5 C
6 C
7 E
8
9
10
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) VETORES E MATRIZES 1 E
2 D
3 E
4 C
5 E
6 C
7 C
8
9
10
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) LISTA ENCADEADA 1 E 11 E
2 C 12 E
3 C 13 E
4 E 14 D
5 C 15 E
6 C 16 E
7 C 17 E
8 E 18 A
9 E 19 C
10 C 20
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) PILHAS 16712855225
1 E 11 E
2 E 12 E
3 E 13 C
4 E 14 C
5 E 15 E
6 D 16 C
7 E 17
8 B 18
9 C 19
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) FILAS Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 89 de 91
10 C 20
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
1 E 11 C
2 E 12 E
3 E 13 C
4 E 14 C
5 E 15 E
6 C 16
7 A 17
8 A 18
9 C 19
10 C 20
GABARITO DOS EXERCÍCIOS COMENTADOS (CESPE) ÁRVORES 1 C
2 C
3 E
4 E
5 C
6 E
7 E
8 C
9
10
9
10
GABARITO DOS EXERCÍCIOS COMENTADOS (FCC) ÁRVORES 1 E
2 B
3
4
5
6
7
8
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) ÁRVORES 1 E
2 E
3 E
4
5
6
7
8
9
10
16712855225
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) GRAFOS 1 E 11 E
2 D 12 E
3 E 13 A
Prof. Diego Carvalho
4 C 14 E
5 C 15 D
6 C 16
7 E 17
www.estrategiaconcursos.com.br
8 E 18
9 C 19
Pág. 90 de 91
10 C 20
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 00
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) HASHING 1 C
2 C
3 E
4 E
5 E
6 E
7
8
9
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 91 de 91
10
Aula 02 Desenvolvimento de Software para Concursos - Curso Regular Professor: Diego Carvalho
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
AULA 02
SUMÁRIO
PÁGINA 01 02 63 72 82 105
Apresentação - Padrões de Projeto - Padrões Java EE - Padrões de Projeto (GRASP) Lista de Exercícios Comentados Gabarito
Lógica de Programação. Tipos de Dados. Operadores e Expressões. Estruturas de Controle, Seleção, Repetição e Desvio. Recursividade. Funções e Procedimentos. Complexidade de Algoritmos. Métodos de Ordenação. BubbleSort, InsertionSort, SelectionSort, QuickSort, ShellSort, MergeSort e HeapSort. Estruturas de Dados. Vetores e Matrizes. Lista Encadeada. Pilhas. Filas. Árvore. Grafos. Hashing. Estrutura de Arquivos. Padrões de Projeto GOF. Padrões de Projeto Java EE. Padrões de Projeto GRASP. Java SE. Conceitos Básicos. Plataforma Java. Compilação e Interpretação. agem por Valor e Referência. Empacotamento. Raiz. Identificadores. Blocos e Comandos. Comentários. Palavras Reservadas. Tipos Primitivos. Operadores. Vetores. Conversão de Tipos. Controle de Fluxos. Classes. Objetos. Atributos. Métodos. Herança. Encapsulamento. Interface. Polimorfismo. Interface Gráfica. Tipos Enumerados. Anotações. Classes Internas. Reflexão e Genéricos. Tratamento de Exceções. Sincronismo e Multithreading. Coleções. Streams e Serialização. Classes e Operações de I/O. Novidades Java 8. Arquitetura Java EE. JSP. Servlets. JSF. JPA. Hibernate. JDBC. JVM. Spring. Struts. JMS. JNDI. JTA. JSTL. HTML e CSS. JavaScript. JQuery. AJAX. DHTML. XHTML. XML. XSLT. XSD. Sistemas Móveis. Android. iOS. Segurança no Desenvolvimento. Compiladores e Interpretadores. Ferramentas de Controle de Versão. SVN. CVS. Git. Análise Estática de Código-Fonte. SonarQube. Integração Contínua (e outros) Framework .NET, C#, Visual Basic, ASP.NET e Visual Studio (Prof. Mayara Rosa) Delphi e PHP (Prof. Mayara Rosa). 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 1 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
PADRÕES DE PROJETO Pessoal, vamos iniciar pelo básico! O que é um Padrão? É um modelo testado ou documentado para se alcançar um determinado objetivo. O autor Christopher Alexander afirma que cada padrão descreve um problema que ocorre repetidas vezes em nosso ambiente e o núcleo de sua solução, de tal forma que ela pode ser usada diversas vezes sem que seja realizada da mesma maneira. E o que seriam Padrões de Projeto (do inglês, Design Patterns)? Respondo: são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico em um contexto específico. Esses padrões nomeiam, abstraem e identificam aspectos comuns em uma estrutura e os torna úteis para que sejam realizados. Como é isso, professor? Suponham que haja uma fábrica de software que desenvolve diversos sistemas para as mais variadas áreas de negócio. Sabe-se que, mesmo em áreas aparentemente distintas ou contrastantes, grande parte dos problemas já possuem uma solução conhecida, formalmente documentada e exaustivamente testada, uma vez que se tratam de problemas recorrentes. Portanto, não há necessidade de se resolver o problema do início se já existe uma solução adequada. Assim sendo, os padrões de projeto são modelos para solucionar problemas gerais de projeto em um contexto particular. Poxa, professor... o engenheiro de software que inventou isso era genial, né?! Qual é, pessoal! Mais uma vez, nós “roubamos” isso de outras engenharias. Em meados de 1977, um sujeito chamado Christopher Alexander (arquiteto, matemático e urbanista austríaco) estudava como melhorar o projeto de edifícios. Ao se cansar de observar repetidos problemas, ele lançou um manifesto com o registro de diversos padrões de projeto recorrentes na engenharia civil. 16712855225
Esse manifesto continha algumas regras e figuras que descreviam métodos para a construção de projetos práticos, seguros e atrativos em quaisquer escalas, desde regiões inteiras a cidades, vizinhanças, jardins, edifícios, salas, entre outros. Cada padrão foi testado no mundo real, sendo revisado por diversos arquitetos e engenheiros. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 2 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Alexander fez uma importante declaração a respeito de padrões de projeto de arquitetura: “Cada padrão descreve um problema que ocorre repetidas vezes em nosso ambiente e, então, descreve o núcleo da solução para aquele problema, de tal maneira que pode-se usar essa solução milhões de vezes sem nunca fazê-la da mesma forma duas vezes”. Bem, isso chamou a atenção de programadores que estavam de saco cheio de ter que refazer várias partes do código para cada projeto. Foi então que, em 1994 quatro engenheiros de software, conhecidos como The Gang of Four, resolveram compilar bibliotecas de soluções para problemas comuns de codificação e lançaram um livro com 23 Padrões de Projeto de Software. Esse livro se tornou um clássico best-seller da literatura orientada a objetos e é recomendado na nossa bibliografia, não obstante ser de leitura extremamente técnica. Concernente aos padrões de projeto, os autores desse livro dizem: “São descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico de design em um contexto específico”. Professor, que contexto específico é esse? Bem, o contexto é inerente a área de negócio! Cada um adapta o padrão genérico ao seu ambiente específico para resolver um mesmo problema. Os padrões de projeto abstraem e identificam os aspectos-chave de uma estrutura de projeto comum para torná-la reutilizável. A tabela abaixo apresenta diversos benefícios dos padrões de projeto:
BENEFÍCIOS E VANTAGENS DOS PADRÕES DE PROJETO Aprender com a experiência de outros, identificando problemas comuns de engenharia de software e utilizando soluções testadas e bem documentadas. Utilizar soluções com nomes que facilitam a comunicação, compreensão e documentação. 16712855225
Facilitam o reúso de soluções arquiteturais bem-sucedidas. Desenvolver softwares de melhor qualidade. Padrões capturam a estrutura estática e a colaboração dinâmica entre objetos participantes no projeto de sistemas. Utilizam polimorfismo, herança, modularidade, composição, abstração para construir código reutilizável, eficiente, de alta coesão e baixo acoplamento.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 3 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Professor, então há apenas benefícios em se utilizar padrões de projetos? Claro que não! Muitas vezes, as tentativas de se escrever um código que esteja em conformidade com um determinado padrão de projeto aumentam desnecessariamente a complexidade do código. Em outras palavras, a tentativa de simplificar pode acabar complicando a implementação. Ademais, estudos mostram que grande parte dos padrões podem ser simplificados ou eliminados utilizando-se recursos diretos das próprias linguagens de programação, como em LISP e DYLAN. Portanto, os Design Patterns podem ser simplesmente um indicativo de que algumas linguagens de programação falham em oferecer determinadas características. Cada padrão de projeto é organizado segundo quatro elementos: Nome, Problema, Solução e Consequências. Nome simplesmente identifica o padrão; Problema descreve a condição em que ele deve ser aplicado; Solução descreve como resolvê-lo; e Consequência descreve os impactos. Por fim, algumas observações importantes! Esses 23 Design Patterns somente podem ser utilizados em projetos de tecnologia da informação? Claro, eles são padrões de projeto de software. Esses 23 Design Patterns somente podem ser utilizados em projetos orientados a objetos? Sim, também. Pessoal, Padrões GOF somente com OO! Padrões de Projeto, em geral, podem usar qualquer paradigma ou linguagem!
16712855225
Os 23 Padrões de Projeto podem ser classificados quanto aos seus propósitos em três tipos: Padrões Criacionais, Padrões Estruturais e Padrões Comportamentais.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 4 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Infelizmente, vocês têm que decorar como se classificam todos os padrões de projeto. A tabela acima apresenta todos os padrões de acordo com seus respectivos propósitos. Os Padrões Criacionais abstraem o processo de criação de objetos a partir da instanciação de classes. Já os Padrões Estruturais tratam da forma como classes e objetos estão organizados para formar estruturas maiores. Por fim, Padrões Comportamentais se preocupam com os algoritmos e responsabilidades dos objetos, que ocorrem em tempo de execução. Pessoal... quando eu estudei esse assunto na minha vida de concurseiro, eu tive uma ajuda sensacional para decorar essa classificação! Eu me utilizei de um mnemônico genialmente criado por um professor chamado Rogério Araújo para - a partir de duas frases bastantes simples - decorar os padrões criacionais e estruturais, como mostra imagem abaixo.
Explicação: A fábrica (Factory Method) abstrata (Abstract Factory) constrói (Builder) um protótipo (Prototype) único (Singleton). A ponte (Bridge) adaptada (Adapter) é composta (Composite) de decorações (Decorator) na fachada (Façade) para o pesomosca (Flyweight) se aproximar (Proxy). E não tem frase para o último? Não, se não é criacional ou estrutural, é comportamental. 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 5 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02 PADRÕES CRIACIONAIS
Abstract Factory: fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. Pessoal, esse padrão de projeto deve ser utilizado quando o sistema for configurado como uma família de produtos, que – uma vez relacionados – são projetados para serem utilizados em conjunto. O Abstract Factory busca assegurar essa restrição, revelando apenas suas interfaces e, não, suas implementações. Considerem a hipótese de se visualizar a globo.com de um desktop ou de um smartphone. Evidentemente, são duas interfaces gráficas diferentes (Clássica e Mobile). Apesar de serem distintas, há bastantes similaridades entre elas. Portanto, é útil aproveitar todo código em comum e implementar com as classes concretas apenas as diferenças. Portanto, o usuário interage apenas com a interface provida pelo padrão Abstract Factory. Entendido? Em tempo de execução, ela descobre, a partir de algum parâmetro fornecido, se o o parte de um smartphone ou de um desktop e, então, instancia apenas a classe concreta específica que irá renderizar a interface gráfica pretendida. Galera, todos os padrões do tipo Factory encapsulam a criação de objetos. O padrão Factory Method, por exemplo, deixa as subclasses decidirem quais objetos criar.
Builder: separa a construção de um objeto complexo da sua representação, de forma que o mesmo processo de construção possa criar diferentes tipos de representações. Pessoal, esse padrão de projeto deve ser utilizado quando o algoritmo para criação de um objeto complexo for independente das partes que compõem o objeto e independente de como ele é montado. Ademais, o processo de construção deve permitir diferentes representações para o objeto que será construído. Esse padrão é bastante parecido com o Abstract Factory. 16712855225
A diferença é que não se constrói uma família de objetos de uma única vez, mas partes do objeto o-a-o! No exemplo anterior, havia duas famílias de objetos compostas de várias partes (botões, barra de rolagem, caixas de seleção, ícones, etc), que compunham a interface de um website em um smartphone ou desktop.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 6 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Ao se descobrir de que dispositivo se tratava, instanciava-se a interface completa do smartphone ou desktop. Agora suponham que um tablete seja capaz de reunir simultaneamente elementos de ambas as interfaces gráficas. O Builder é capaz de coordenar a construção da interface gráfica do tablete ao instanciar partes dessas duas interfaces. Portanto, ele pode criar diferentes representações de suas interfaces gráficas ao instanciar, por exemplo, um botão da interface do smartphone, a barra de rolagem da interface do desktop, caixas de seleção da interface do smartphone e ícones da interface do desktop. O Builder possui uma classe que coordena a construção desses objetos até a criação da representação final.
Factory Method: define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar. Pessoal, esse padrão de projeto deve ser utilizado quando uma classe não puder antecipar qual objeto ela deve criar. Deve ser usado, também, quando uma classe quer que suas subclasses especifiquem os objetos que ela criar. Por fim, deve ser usado para delegar responsabilidades a diversas outras subclasses. Considerem a hipótese de se visualizar as características de um carro de uma concessionária. No entanto, sabe-se que em uma concessionária há diversos modelos de carro. Então, pode-se criar uma classe abstrata base para representar todos os carros e especializá-la em subclasses que representem cada tipo de carro (Corsa, Celta, Cruze, Camaro, etc). No entanto, o problema surge quando se quer criar um objeto, uma vez que – de alguma forma – precisa-se identificar qual objeto se deseja criar. O Factory Method cria objetos concretos que implementam a classe base e especializam cada objeto, sendo definidos, pelo usuário, em tempo de execução, qual carro deverá ser instanciado. É bom destacar que ele – conforme especificado – contém diversos elementos, tais como: Creator, ConcreteCreator, Product e ConcreteProduct. 16712855225
Prototype: especifica os tipos de objetos para criar usando uma instância como protótipo e cria novos objetos copiando este protótipo. Pessoal, esse padrão de projeto deve ser utilizado quando um sistema possuir componentes cujo estado inicial tenha poucas variações. É oportuno disponibilizar Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 7 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
um conjunto pré-estabelecido de protótipos que dão origem aos objetos que compõem o sistema. Dessa forma, basta modificar os atributos que forem diferentes e adaptar o objeto para o uso pretendido. Considerem a hipótese de se preencher os dados de todas as pessoas de uma família e que cada objeto Pessoa contenha centenas de atributos, tais como: Nome, Idade, Endereço, Telefone Residencial, Nacionalidade, Classe Social, etc. Vamos supor que sejam preenchidos todos os atributos do objeto Pessoa referente ao pai, mas ainda falta preencher os dados da mãe e filhos. Portanto, sabe-se que atributos como Endereço, Telefone Residencial, Nacionalidade, etc provavelmente serão idênticos para todos os membros da família. Logo, ao invés de se criar um novo objeto para cada membro e preenchêlos um a um integralmente, pode-se clonar o objeto pai já preenchido e modificar apenas os atributos diferentes, como Nome, Idade, entre outros. Entre os benefícios adicionais decorrentes da utilização desse padrão, inserem-se: acrescenta e remove produtos em tempo de execução; reduz o número de subclasses; configura dinamicamente uma aplicação com classes; especifica novos objetos pela variação de valores; e especifica novos objetos pela variação da estrutura. Bacana?
Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. Pessoal, esse padrão de projeto deve ser utilizado quando houver a necessidade de existir exatamente uma instância de uma classe e ela deverá ser ível aos clientes a partir de um ponto de o conhecido. Vamos considerar a hipótese de um sistema que trabalhe com diversas conexões com o banco de dados em uma mesma execução. 16712855225
Imaginem a perda de desempenho ao se instanciar a classe de conexão com o banco de dados várias vezes. O Padrão Singleton resolve esse problema ao garantir que só haverá uma instância de conexão com o banco de dados e, assim, assegurar que – pelo menos durante uma determinada execução – a classe será instanciada apenas uma única vez.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 8 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02 PADRÕES ESTRUTURAIS
Adapter: converte a interface de uma classe em outra interface que normalmente não poderiam trabalhar juntas por serem incompatíveis. Pessoal, esse padrão de projeto deve ser utilizado quando se quer usar uma classe e sua interface não é compatível com aquela de que você necessita. Deve ser usado, também, quando se quer criar classes reusáveis que cooperem com classes que não têm necessariamente interfaces compatíveis. Essa classe funciona como um adaptador de tomada. Frequentemente, quer se utilizar uma tomada de três pinos, porém a tomada disponível só permite dois pinos. Usa-se, então, um adaptador que converte a interface de uma das tomadas permitindo que se faça a conexão normalmente. Ela permite que um objeto cliente utilize serviços de outros objetos com interfaces diferentes. Considerem a hipótese de um objeto que contenha dados de um formulário de Vistos de Imigração do sistema da polícia federal, como Data de Nascimento (no formato DD:MM:AAAA). Entretanto, esse objeto deve se comunicar com outro objeto do sistema da embaixada americana, que adota o formato MM:DD:AAAA. Nesse caso, um Adapter seria extremamente oportuno!
Bridge: desacopla uma interface de sua implementação, de forma que ambas possam variar independentemente. Pessoal, esse padrão de projeto deve ser utilizado quando se deseja evitar um vínculo permanente entre uma abstração e sua implementação. Ele é recomendado também quando se quer evitar que mudanças na implementação de uma abstração causem impacto nos clientes, i.e., seu código não deve ter que ser recompilado. Entenderam? 16712855225
O Bridge fornece um nível de abstração maior que o Adapter, na medida em que permite variações independentes da interface e da implementação. Ele provê alto nível de desacoplamento de componentes, fazendo uma ponte entre as hierarquias de classes relacionadas. Esse padrão de projeto é um pouco complicado de se entender, portanto prestem atenção!
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 9 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Considerem a hipótese de um conjunto de janelas gráficas que funcionem em diversas plataformas (Windows, Linux, Mac, etc). Professor, por que não usar o Adapter? De fato, ele poderia adaptar interfaces para cada uma das plataformas. No entanto, há dezenas de tipos de janelas gráficas (Diálogo, Aviso, Erro, etc), tornando a utilização inviável para grandes quantidades. Uma ideia melhor seria criar uma interface para as plataformas e outra para as janelas. A primeira conteria os elementos comuns das plataformas e teria classes concretas específicas para implementar janelas em Linux, Mac, etc. A segunda conteria os elementos comuns das janelas e teria classes concretas específicas para implementar Janelas de Diálogo, Aviso, Erro, etc. Portanto, ao chamar um método da classe concreta da interface de janelas, ela realizará chamadas aos métodos concretos da interface de plataformas. Assim, caso se queira adicionar mais tipos de janelas ou mais plataformas, não haverá impacto no cliente, não haverá recompilação de código e não haverá vínculo entre as interfaces de um e implementações de outros. O desacoplamento permite que se modifique o código da interface de plataformas sem alterar a implementação das janelas e vice-versa. Vocês percebem que, assim, pode-se combinar as interfaces e implementações de quaisquer maneiras possíveis? Pois é, esse é o grande benefício do padrão Bridge. Como nós vimos anteriormente, basta lembrar de uma ponte.
Composite: compõe objetos em estruturas de árvore para representar hierarquias parte-todo, permitindo aos clientes tratarem objetos individuais e composições de objetos uniformemente. 16712855225
Pessoal, esse padrão de projeto deve ser utilizado quando se deseja representar hierarquias parte-todo de objetos e quando se deseja que os clientes ignorem a diferença entre composições de objetos e objetos individuais. Assim, eles tratarão todos os objetos em uma estrutura composta uniformemente. Considerem a hipótese de uma interface gráfica composta de vários objetos. Em muitos casos, esses objetos são compostos de outros objetos. Uma excelente implementação dessa interface seria, por exemplo, por meio de uma árvore, porém tudo deve ser transparente para o cliente – ele precisa saber de nada disso. Dessa forma, ele não deve diferenciar objetos individuais (Folhas) de outros objetos compostos (Nós). Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 10 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Decorator: anexa responsabilidades adicionais a um objeto dinamicamente. Fornece uma alternativa flexível em relação à herança para estender funcionalidades. Pessoal, esse padrão de projeto deve ser utilizado quando se quer adicionar responsabilidades a objetos individuais dinâmica e transparentemente, i.e., sem afetar outros objetos. Também é utilizado quando extensões por subclasses forem impraticáveis, tendo em vista o possível número de extensões independentes. Considerem a hipótese de um Subway! Usando-se herança, cria-se uma classe abstrata sanduíche e várias classes concretas para implementá-la. No entanto, há sanduíches com almôndega, sem queijo, com tomate, sem cebola, etc. É customizável, portanto é completamente inviável construir classes concretas para cada tipo de sanduíche, devido a gigantesca quantidade de combinações. O Padrão Decorator sugere que o objeto sanduíche anexe diversas responsabilidades dinamicamente. Dessa forma, em tempo de execução, à medida que se adicione um novo ingrediente, cria-se mais uma responsabilidade. Ao contrário da herança, que aplica funcionalidades a todos os seus objetos, o Decorator aplica apenas a um objeto específico.
Façade: oferece uma interface unificada para um conjunto de interfaces em um subsistema, definindo uma interface de alto nível que facilita a utilização do subsistema. 16712855225
Pessoal, o Padrão de Projeto Façade (também é um dos mais importantes) deve ser utilizado quando se desejar fornecer uma interface simples para um subsistema complexo ou também quando se deseja dividir em camadas os subsistemas. É também utilizando quando existem diversas dependências entre clientes e as classes de implementação de uma abstração. Considerem a hipótese de um banco com um sistema legado de informações de crédito muito complexo, que deve interagir com um sistema de banco de dados recém implementado. Para que ele e o sistema legado, pode-se utilizar o padrão Façade para facilitar a utilização por meio de uma interface de alto nível e, assim, não há de se interagir diretamente com o sistema complexo. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 11 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Flyweight: usa compartilhamento para ar eficientemente grandes quantidades de objetos de baixa granularidade. Pessoal, esse padrão de projeto deve ser utilizado quando uma aplicação usa grande número de objetos e os custos de armazenamento forem altos. Deve ser utilizado, também, quando muitos grupos de objetos puderem ser substituídos por relativamente poucos objetos compartilhados, uma vez que os estados extrínsicos forem removidos. Considerem a hipótese de um texto escrito no Microsoft Word, em que cada caractere seja um objeto que contenha posição, formato e tamanho – isso poderia ocupar toda memória disponível no sistema, mas percebam que vários caracteres se repetem diversas vezes (ex: letra A) e eles são exatamente iguais, muda-se somente a posição (ex: 200 ocorrências da letra A em várias posições). Portanto, cada caractere deve possuir uma referência para um objeto Flyweight, que deverá ser compartilhado por todas as instâncias do mesmo caractere do documento, exceto a posição que será variável. Portanto, em vez de armazenarem 800 objetos com três atributos, armazenam-se 800 objetos com um atributo e ponteiro para o objeto Flyweight.
Proxy: provê um substituto ou ponto através do qual um objeto pode controlar o o a outro objeto. Pessoal, esse padrão de projeto deve ser utilizado quando houver uma necessidade de uma referência mais versátil ou sofisticada para um objeto do que um simples ponteiro. Por exemplo, proxies virtuais criam objetos caros por demanda e proxies de proteção controlam o o ao objeto original. Considerem a hipótese de um sistema que e um banco de dados por meio de uma classe de conexão. 16712855225
No entanto, por medidas de segurança, vamos supor que se deseja que esse sistema não tenha o direto ao banco de dados referido. Dessa forma, o usuário se conectará ao Proxy (i.e., a classe substituta ou suplente) e o Proxy que irá se conectar ao banco de dados. Claro, tudo isso ocorrendo de maneira transparente para o usuário.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 12 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02 PADRÕES COMPORTAMENTAIS
Chain of Responsability: evita o acoplamento do remetente de uma requisição ao seu receptor ao dar a mais de um objeto a chance de lidar com a requisição. Pessoal, esse padrão de projeto deve ser utilizado quando se deseja emitir uma solicitação para um dentre vários objetos, sem especificar explicitamente o receptor ou quando mais de um objeto é capaz de lidar com a requisição e ele não for conhecido a priori. Também é utilizado quando um conjunto de objetos que podem lidar com uma requisição forem especificados dinamicamente. Esse padrão acaba com estruturas de decisão ao criar uma cadeia de objetos em que se a a responsabilidade até encontrar aquele que pode respondê-la. Consideremos a hipótese de uma loja virtual que permite pagamento online por meio de diversos bancos. Dado um parâmetro, deve-se identificar qual banco deve ser utilizado para o pagamento. Esse problema pode ser resolvido com outros padrões, entretanto o Chain of Responsability fornece uma solução com fraco acoplamento ao dar a cada elemento da cadeia a oportunidade de implementar a requisição da maneira que quiserem. Assim, não há uma associação direta entre o remetente e o receptor que irá lidar com a requisição.
Command: encapsula a requisição de um objeto, portanto permitindo que se parametrize os clientes com diferentes requisições. Pessoal, esse padrão de projeto deve ser utilizado quando se deseja parametrizar objetos para realizar alguma execução ou também para especificar, enfileirar e executar requisições a qualquer momento. Ele também é utilizado para ar mudanças de log de maneira que possa ser reaplicado no caso de uma queda no sistema. Entenderam? 16712855225
Considerem a hipótese de um interruptor que ligue ou desligue uma lâmpada. Esse interruptor encapsula uma requisição, de tal modo que se possa utilizá-lo para diferentes dispositivos. Em outras palavras, se eu retirar um interruptor de uma lâmpada, conectar adequadamente aos fios de um computador, é possível ligar/desligar o computador com o mesmo interruptor.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 13 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Portanto, o interruptor tem sua interface encapsulada, logo pode ser utilizado em qualquer dispositivo que tenha uma interface Ligar/Desligar. Imaginem agora uma classe que faz diversas conexões a um banco de dados. Não é recomendável que a classe tenha um método que se conecte diretamente ao banco, portanto encapsulase essa conexão, diminuindo a dependência.
Interpreter: dada uma linguagem, define uma representação para sua gramática em conjunto com um interpretador que utiliza a representação para interpretar sentenças na linguagem. Pessoal, esse padrão de projeto deve ser utilizado quando houver uma linguagem para interpretar e quando se puder representar declarações nessa linguagem como árvores sintáticas abstratas. Ele funciona bem quando a gramática é simples, permitindo um fácil gerenciamento e quando a eficiência não é um fator crítico de sucesso. Basta lembrar do Java, que é uma linguagem interpretada. O que isso quer dizer esse negócio de interpretada, professor? Bem, isso significa que o código fonte é compilado em um bytecode, que é então posteriormente interpretado por um interpretador. Dessa forma, esse padrão de projeto é utilizado nos casos em que é possível definir uma linguagem com uma gramática que possa ser, posteriormente, interpretada.
Iterator: fornece uma maneira de ar elementos de um objeto agregado sequencialmente sem expor sua representação interna. Pessoal, esse padrão de projeto deve ser utilizado quando se deseja ar o conteúdo de um objeto agregado sem expor a sua representação interna e para fornecer uma interface uniforme para diferentes estruturas de agregação. Ele também é recomendado para ar múltiplos os a objetos agregados. Entendido? Vamos ver um exemplo! 16712855225
Considerem a hipótese de se desejar percorrer sequencialmente quatro coleções distintas (Lista, Arrays, Map e Set) de objetos bastante complexos. Em uma situação normal, deve-se conhecer a representação interna de cada uma dessas coleções. O Iterator permite que se percorra todas essas coleções sem precisar saber detalhes de seu funcionamento.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 14 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Mediator: define um objeto que encapsula a forma como um conjunto de objetos interagem, promovendo um fraco acoplamento ao evitar que objetos se refiram aos outros explicitamente. Pessoal, esse padrão de projeto deve ser utilizado quando um conjunto de objetos se comunicar de maneira bem definida, porém complexa e quando o reúso de um objeto for difícil por referenciar e se comunicar com muitos outros objetos. Ademais, ele é utilizado quando um comportamento distribuído entre diversas classes puder ser customizado sem a criação de muitas subclasses. Considerem a hipótese de um software complexo com grandes quantidades de classes, de tal modo que a lógica de processamento está distribuída entre elas. Todo mundo sabe que, há cada manutenção ou refatoração, o desenho do software pode se tornar mais complexo e a comunicação entre as classes pode ser mais difícil de ler entender. Portanto, o Padrão Mediator permite que a comunicação entre objetos seja encapsulada em um outro objeto mediador. Assim, não haverá mais uma comunicação direta entre as classes, reduzindo o acoplamento, garantindo que todos fiquem mais livres para serem modificados e diminuindo a complexidade de comunicação entre objetos.
Memento: captura e externaliza o estado interno de um objeto, sem violar seu encapsulamento, de maneira que o objeto possa ser restaurado posteriormente. Pessoal, esse padrão de projeto deve ser utilizado quando uma parte do estado de um objeto precisar ser armazenada, de forma que possa ser recuperada posteriormente. Ele é utilizado, também, para evitar que uma interface direta para obter um estado exponha detalhes de implementação e quebrem o encapsulamento do objeto. 16712855225
Considerem a hipótese de um editor de texto que guarde o estado interno do objeto, i.e., o que o usuário está digitando, aí ele deleta uma palavra, mas se arrepende e deseja voltar ao estado anterior. Bem, o memento oferece uma maneira de desfazer ações sem ter o ao que estava sendo escrito, ele apenas retorna o estado anterior, mas sem olhar o que estava escrito. Portanto, o Padrão Memento permite a captura e externalização do estado interno de um objeto, sem violar seu encapsulamento, i.e., ele captura o que estava escrito Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 15 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
e mostra ao usuário, porém sem ter o direto ao que estava escrito. Dessa forma, pode-se cancelar operações e desfazer alterações para retornar ao estado anterior.
Observer: define uma dependência um-para-muitos entre objetos para que, quando um objeto mudar de estado, os seus dependentes sejam notificados e atualizados automaticamente. Pessoal, esse padrão de projeto deve ser utilizado quando uma mudança em um objeto requisitar mudanças em outros e não se souber quantos objetos necessitam ser modificados. Ele também é utilizado quando uma abstração possuir dois aspectos, um dependente do outro. Ademais, é recomendado quando um objeto for capaz de notificar outros sem assumir quem são. Considerem a hipótese de uma tabela de classificação do campeonato brasileiro com um gráfico de pizza informando vitórias, empates e derrotas de um determinado time, assim como um gráfico com a variação de posição do time do campeonato. Aí chega o domingão, ocorrem 10 jogos e o estagiário altera a tabela com os novos dados. E agora? Como ficam os gráficos? Tem que atualizar cada um na mão? Enquanto ele não atualiza, os gráficos ficarão desatualizados? Não haverá nem uma notificação de que há novos dados? Bem, o padrão Observer serve para isso! Ele cria uma dependência dos gráficos em relação à tabela de modo que, quando a tabela muda de estado, os gráficos são atualizados automaticamente.
State: permite a um objeto alterar o seu comportamento quando o seu estado interno for modifica . 16712855225
Pessoal, esse padrão de projeto deve ser utilizado quando o comportamento de um objeto depender de seu estado e ele deve mudar este comportamento em tempo de execução de acordo com este estado. Ademais, é recomendado quando operações tiverem declarações condicionais grandes que dependam do estado do objeto. Considerem a hipótese do jogo Super Mario Bros! Lembram-se de quando ele conseguia uma flor de fogo? Se ele estivesse pequeno, ele ficava grande e pegando fogo! Se ele estivesse grande, ele ficava pegando fogo! Se ele já estivesse pegando Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 16 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
fogo, ele ganhava 1000 pontos! Se ele tivesse com uma capa de voo, ele perdia a capa e ficava pegando fogo! Portanto, notem que o estado futuro depende de seu estado atual e o estado futuro é decidido em tempo de execução, i.e., durante o jogo. O Padrão State elimina a necessidade de condicionais complexos, tendo em vista que podem haver dezenas ou centenas de estados possíveis. A grande vantagem é que esta solução torna mais simples adicionar estados e suas transições.
Strategy: define uma família de algoritmos, encapsula cada um e faz deles intercambiáveis. Pessoal, esse padrão de projeto deve ser utilizado quando várias classes relacionadas diferirem apenas em seus comportamentos e que houver necessidade de diferentes variantes de um algoritmo. Ele também é utilizado quando uma classe definir muitos comportamentos e eles aparecerem como declarações condicionais em suas operações. Considerem a hipótese de uma escola querer organizar os meninos e as meninas por ordem de idade. Há uma família de algoritmos capaz de realizar essa operação (BubbleSort, QuickSort, Heapsort, MergeSort, etc). Uma maneira de realizar essa operação é por meio de operadores condicionais (if-else), porém isso pode ser muito trabalhoso em grandes quantidades. Uma boa estratégia seria encapsular os algoritmos de ordenação, de modo que se possa trocar de algoritmo sempre que quiser. Assim, basta chamar o método OrdenaAluno com os parâmetros sexoAluno e algoritmoOrdenacao. Dessa forma, é possível chamar o método ordenaAluno(menino, bubbleSort) ou ordenaAluno(menina, mergeSort), etc, diminuindo o acoplamento. 16712855225
Template Method: define o esqueleto de um algoritmo dentro de uma operação, deixando alguns os a serem preenchidos pelas subclasses. Pessoal, esse padrão de projeto deve ser utilizado quando se deseja implementar a parte invariante de um algoritmo e deixar que as subclasses implementem o comportamento variável. Ele também é recomendado quando comportamentos comuns entre subclasses forem fatorados e localizados em uma classe comum, para evitar duplicação de código. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 17 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Considerem a hipótese de uma franquia de McDonald’s fabricando um sanduíche. Bem, o cliente pode pedir para colocar mais queijo, tirar os picles, adicionar ketchup, não colocar sal, entre outras opções. No entanto, observem que operações como: abrir o pão, posicionar o hambúrguer no meio e fechar o pão são operações que sempre irão ocorrer. Portanto, esse esqueleto de algoritmo jamais irá mudar. Já as opções de condimentos, verduras, etc podem ser modificadas de acordo com o gosto do cliente. Sendo assim, a parte invariável será implementada na classe abstrata e a parte variável será implementada pelas classes filhas de acordo com as necessidades do usuário.
Visitor representa uma operação a ser realizada sobre elementos de uma estrutura de objetos e permite definir uma nova operação sem mudar as classes dos elementos sobre os quais opera. Pessoal, esse padrão de projeto deve ser utilizado quando muitas operações distintas e não relacionadas precisarem ser executadas sobre uma estrutura de objetos e se quer evitar a poluição das classes com essas operações. Ademais, são recomendadas quando as classes que definem a estrutura do objeto raramente forem modificadas. Considerem a hipótese de uma compra em um supermercado. O carrinho de compras é a estrutura de dados que contém um conjunto de elementos. Ao finalizar a compra, deve-se ar a responsabilidade para o caixa (Visitor). A partir deste momento, ele estará no comando, porque ele que realizará a soma dos preços, pesará as frutas, verduras, vegetais, etc (entre outras operações). 16712855225
Portanto, algumas operações se aplicam a alguns elementos, mas não se aplicam a outros, i.e., uma cerveja já possui um valor, mas uma maça precisa ser pesada. No entanto, ambas fazem parte da mesma estrutura de dados. Sendo assim, o Visitor recebe o elemento e sabe qual operação deve realizar. Ademais, se houver uma nova operação, é mais fácil de acomodar no Visitor.
FALOU EM... 1
...SERÁ:
FREQUÊNCIA1
Frequência de aparições em prova! Os mais frequentes são: Singleton, Adapter, Façade e Abstract Factory.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 18 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Criar famílias de objetos relacionados...
Abstract Factory
5
Builder
4
Factory Method
3
Criar uma instância prototípica...
Prototype
2
Apenas uma instância com um ponto global a ela...
Singleton
9
Converte uma interface em outra, por serem incompatíveis... . Desacoplar interface da implementação...
Adapter
8
Bridge
2
Estruturas de árvore em hierarquia parte-todo...
Composite
1
Anexa responsabilidades adicionais dinamicamente...
Decorator
1
Construção de um objeto complexo com diferentes representações... Deixar subclasses decidirem...
Interface unificada de alto nível para simplificar outra complexa... Compartilhamento para ar grandes quantidades de objetos... Prover substituto para controlar um objeto
Façade
7
Flyweight
0
Proxy
1
Evitar o acoplamento dando oportunidade a outros objetos...
Chain of Responsability
2
Encapsula requisição de objetos...
Command
2
Representação de uma gramática...
Interpreter
0
Iterator
4
Encapsula a forma como objetos interagem...
Mediator
1
Captura o estado interno de um objeto...
Memento
1
Quando objeto mudar de estado, notifica os dependentes...
Observer
3
State
0
Strategy
1
Template Method
2
Interface única para ar coleções sequencialmente... 16712855225
Altera comportamentos quando modificar o estado interno... Família de algoritmos... Esqueleto de algoritmos...
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 19 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Operação a ser realizada sobre uma estrutura de objetos...
0
Visitor
Galera, vou ser bem sincero com vocês: esse assunto é chato pacas – é muito decoreba! Então, vou explicar o que eu recomendo para o estudo dessa aula – fiz a análise estatístico rápida e cheguei a algumas conclusões! Primeiro de tudo, decore as frases porque cerca de 15% das questões de prova exigem apenas saber qual Padrão de Projeto GOF pertence a qual categoria.
Vocês matam 15% das questões apenas decorando aquelas frases, bacana? Segundo, se você estiver sem tempo, ignore a categoria comportamental, visto a distribuição de questões segue a tabela mostrada acima. Além disso, dos 23 Padrões de Projeto, seis correspondem à 55% das questões de prova (dos 85% restantes, i.e., sem as questões de categorias). São eles, em ordem:
16712855225
Pessoal, se tiver com o tempo apertado, estudem apenas esses acima! Do mesmo modo, podemos afirmar que, dos 23 Padrões de Projeto, onze correspondem à 15% das questões de prova: Decorator, Flyweight, Proxy, Chain of Responsability, Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 20 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Interpreter, Mediator, Memento, State, Strategy e Template Method. Os seis padrões restantes, estão no meio termo e correspondem a 30% das questões de prova.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 21 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - 2013 - INPI - Analista de Planejamento - Desenvolvimento e Manutenção de Sistemas) O padrão bridge, além de converter a interface de uma classe existente em outra interface esperada pelos clientes, permite que algumas classes com interfaces diferentes funcionem conjuntamente. Comentários: Bridge: desacopla uma interface de sua implementação, de forma que ambas possam variar independentemente. Adapter: converte a interface de uma classe em outra interface que normalmente não poderiam trabalhar juntas por serem incompatíveis. Converte a interface de uma classe existente em outra interface? Opa, isso é Adapter! Gabarito: E (CESPE - 2013 - INPI - Analista de Planejamento - Desenvolvimento e Manutenção de Sistemas) Design patterns não se aplicam, exclusivamente, ao Java, podendo ser empregados em projetos que utilizam linguagem C#. Comentários: 16712855225
Por fim, algumas observações importantes! Esses 23 Design Patterns somente podem ser utilizados em projetos de tecnologia da informação? Claro, eles são padrões de projeto de software. Esses 23 Design Patterns somente podem ser utilizados em projetos orientados a objetos? Sim, também. Pessoal, Padrões GOF somente com OO! Padrões de Projeto, em geral, podem usar qualquer paradigma ou linguagem! Padrões de Projeto (Design Patterns) se aplicam a qualquer linguagem de programação e qualquer paradigma. Gabarito: C
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 22 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6) O padrão de projeto conhecido como façade é indicado para a definição de uma interface de nível mais alto que torne mais fácil a comunicação entre os subsistemas de um sistema complexo. Comentários: Façade: oferece uma interface unificada para um conjunto de interfaces em um subsistema, definindo uma interface de alto nível que facilita a utilização do subsistema. Definição de uma interface de nível mais alto que torne mais fácil a comunicação? Opa, isso é Façade. Gabarito: C (CESPE - 2010 - TRT - 21ª Região (RN) - Técnico Judiciário - Tecnologia da Informação) Os padrões de projeto podem ser definidos como soluções já testadas para problemas que ocorrem frequentemente durante o projeto de software. Comentários: E o que seriam Padrões de Projeto (do inglês, Design Patterns)? Respondo: são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico em um contexto específico. Esses padrões nomeiam, abstraem e identificam aspectos comuns em uma estrutura e os torna úteis para que sejam realizados. Como é isso, professor? 16712855225
Essa ficou fácil, questiona apenas a definição! É isso mesmo... Gabarito: C (CESPE - 2008 - STJ - Analista Judiciário - Tecnologia da Informação) Os padrões de projeto podem ser usados no projeto orientado a objetos para apoiar o reúso de software. Esses padrões frequentemente empregam a herança e o polimorfismo para prover generalidade. Abstract factory, strategy e template method são padrões de projeto que podem ser empregados nos frameworks orientados a objetos para facilitar a adaptação dos frameworks.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 23 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Comentários: A questão está toda correta! A única dúvida que poderia gerar seria em relação a última parte, porém esses três padrões têm o intuito – sim – de adaptar frameworks. Gabarito: C (CESPE - 2008 - -DF - Analista Judiciário - Tecnologia da Informação) O padrão de projeto orientado a objetos denominado singleton exprime o fenômeno recorrente na análise que é a existência de muitas aplicações nas quais há um objeto que é a única instância de sua classe. Comentários: Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. Um objeto que é a única instância de sua classe? Opa, isso é Singleton! Gabarito: C (CESPE - ANAC - Técnico istrativo - Informática) O uso de padrões de projeto somente pode ser aplicado a projetos que implementam o paradigma de programação orientada a objetos. Comentários: Por fim, algumas observações importantes! Esses 23 Design Patterns somente podem ser utilizados em projetos de tecnologia da informação? Claro, eles são padrões de projeto de software. Esses 23 Design Patterns somente podem ser utilizados em projetos orientados a objetos? Sim, também. Pessoal, Padrões GOF somente com OO! Padrões de Projeto, em geral, podem usar qualquer paradigma ou linguagem! 16712855225
Pessoal, não caiam nessa pegadinha! Padrões GOF somente podem ser aplicados a projetos orientados a objetos. No entanto, Padrões de Projeto (sem especificar quais) podem ser usados com qualquer paradigma. Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 24 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - 2008 - SERPRO - Analista - Desenvolvimento de Sistemas) Adapter é um padrão estrutural utilizado para compatibilizar interfaces de modo que elas possam interagir. Comentários:
Estrutural? Lembrem-se do mnemônico: “A Ponte Adaptada (...)”, portanto é estrutural. Compatibilizar interfaces de modo que elas possam interagir? Opa, isso é Adapter! Logo, a questão está toda correta. Gabarito: C (CESPE - 2008 - SERPRO - Analista - Desenvolvimento de Sistemas) O Singleton é um padrão que garante que uma classe tenha apenas uma instância. 16712855225
Comentários: Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. Classe com apenas uma instância? Opa, isso é Singleton! Gabarito: C
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 25 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
10. (CESPE - SERPRO - Analista - Desenvolvimento de Sistemas) Alguns padrões de criação como o Prototype, o Proxy e o Façade não são adequados para a programação orientada a objetos. Comentários: Como é? Não faz nenhum sentido! Questão errada! Gabarito: E 11. (CESPE - TCU - Analista de Controle Externo - Tecnologia da Informação - Prova 2) Caso seja verificado no desenvolvimento de um sistema forte acoplamento entre as classes, recomenda-se o uso do padrão de comportamento Factory Method, que evita o acoplamento do remetente de uma solicitação ao seu receptor, dando a mais de um objeto a oportunidade de tratar uma solicitação, mesmo nos casos em que o conjunto de objetos não seja conhecido a priori ou seja definido dinamicamente. Comentários:
16712855225
Padrão de Comportamento Factory Method? Espera aí: “A fábrica abstrata constrói (...)”. Opa, Factory Method é um padrão criacional! Ademais, a descrição se trata do padrão Chain of Responsability! Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 26 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
12. (CESPE - TCU - Analista de Controle Externo - cnologia da Informação - Prova 2) No desenvolvimento de um sistema estruturado em subsistemas para facilitar o o e minimizar a comunicação e dependências entre os subsistemas, o padrão de criação Factory Method, que fornece uma interface para a criação de famílias de objetos relacionados ou dependentes sem especificar suas classes concretas, é mais indicado que o padrão de criação Prototype. Comentários: Abstract Factory: fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. Factory Method: define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar. Fornece uma interface para a criação de famílias de objetos? Opa, isso é Abstract Factory - não confundam com Factory Method! Um aluno já me perguntou sobre o início da questão, mas cuidado: no início, fala-se de um sistema estruturado, mas isso nada tem a ver com paradigma estruturado – é estruturado, no sentido de organizado. Gabarito: E 13. (CESPE - TCU - Analista de Controle Externo - Tecnologia da Informação - Prova 2) Se, no desenvolvimento de uma aplicação que leia documentos do tipo txt e seja capaz de converter o documento em vários formatos distintos, houver a necessidade de facilitar acréscimos de novos tipos de conversão, será mais indicado o uso do padrão de estrutura Adapter que o uso do padrão de estrutura Bridge, pois o padrão Adapter separa a construção de um objeto complexo de sua representação para criar representações diferentes com o mesmo processo. 16712855225
Comentários: Builder: separa a construção de um objeto complexo da sua representação, de forma que o mesmo processo de construção possa criar diferentes tipos de representações. Separa a construção de um objeto complexo de sua representação? Opa, isso é Builder! Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 27 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Gabarito: E 14. (CESPE - 2013 - ANTT - Desenvolvimento de Sistemas) Em programação orientada a objetos, o padrão de projeto denominado Iterator define uma forma de o sequencial aos elementos de um objeto agregado, sem expor sua representação interna. Comentários: Iterator: fornece uma maneira de ar elementos de um objeto agregado sequencialmente sem expor sua representação interna. o sequencial aos elementos de um objeto agregado? Opa, isso é Iterator! Gabarito: C 15. (CESPE - 2013 - ANTT - Desenvolvimento de Sistemas) Em programação orientada a objetos, o padrão de projeto denominado Singleton define uma classe que possui apenas uma instância e provê um ponto de o local a ela. Comentários: Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. Classe que possui apenas uma instância? Opa, isso é Singleton! No entanto, ele diz que é um ponto de o local! Opa... não, é um ponto de o global! 16712855225
Gabarito: E 16. (CESPE - 2013 – TCO/RO - Analista de Informática – Desenvolvimento de Sistemas) Uma das aplicabilidades do padrão Iterator é a representação de hierarquias do tipo todo-parte de objetos, de modo que a aplicação seja capaz de ignorar a diferença entre composições de objetos e objetos individuais, haja vista que todos os objetos tratados no padrão têm comportamento uniforme. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 28 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Composite: compõe objetos em estruturas de árvore para representar hierarquias parte-todo, permitindo aos clientes tratarem objetos individuais e composições de objetos uniformemente. Iterator: fornece uma maneira de ar elementos de um objeto agregado sequencialmente sem expor sua representação interna. Representação de hierarquias do tipo todo-parte? Comportamento uniforme? Opa, isso é Composite! Gabarito: E 17. (CESPE - 2013 – TCO/RO - Analista de Informática – Desenvolvimento de Sistemas) O padrão Adapter será mais apropriado que o Façade quando for necessário fornecer uma interface unificada para um conjunto de interfaces em um subsistema. Comentários: Façade: oferece uma interface unificada para um conjunto de interfaces em um subsistema, definindo uma interface de alto nível que facilita a utilização do subsistema. Adapter: converte a interface de uma classe em outra interface que normalmente não poderiam trabalhar juntas por serem incompatíveis. Interface unificada para um conjunto de interfaces em um subsistema? Opa, isso é Façade, logo ele é mais indicado! 16712855225
Gabarito: E 18. (CESPE - 2013 – TCO/RO - Analista de Informática – Desenvolvimento de Sistemas) O uso do padrão Builder tem a vantagem de permitir o controlado à instância de uma classe, uma vez que ele encapsula a classe, criando um ponto global único de o. Comentários: Builder: separa a construção de um objeto complexo da sua representação, de forma que o mesmo processo de construção possa criar diferentes tipos de representações. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 29 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. Ponto global único de o? Opa, isso é Singleton! Gabarito: E 19. (CESPE - 2013 – TCO/RO - Analista de Informática – Desenvolvimento de Sistemas) Os padrões estruturais, tais como o Bridge e o Proxy, abstraem o processo de instanciação, ajudando a tornar um sistema independente de como os seus objetos são criados. Já os padrões de criação, como Prototype e o Builder, se preocupam com a forma como as classes e os objetos são criados para formar estruturas compostas maiores. Comentários: Os Padrões Criacionais abstraem o processo de criação de objetos a partir da instanciação de classes. Já os Padrões Estruturais tratam da forma como classes e objetos estão organizados para formar estruturas maiores. Por fim, Padrões Comportamentais se preocupam com os algoritmos e responsabilidades dos objetos, que ocorrem em tempo de execução. A questão inverteu os conceitos! Os padrões estruturais tratam da forma como as classes e objetos são organizados (a banca usou o termo “criados”, que não é o mais correto) para formar estruturas maiores e os padrões criacionais abstraem o processo de instanciação. 16712855225
Gabarito: E
(CESPE - 2012 - BASA - Tecnologia da Informação – Técnico Científico) O padrão mediator define um objeto que encapsula como um conjunto de objetos interage. Esse padrão torna desnecessário que cada objeto armazene referências para todos os objetos com os quais interage e pode ser usado quando objetos se comunicam de forma definida, mas complexa. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 30 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Mediator: define um objeto que encapsula a forma como um conjunto de objetos interagem, promovendo um fraco acoplamento ao evitar que objetos se refiram aos outros explicitamente. Encapsula a forma como um conjunto de objetos interagem? Opa, isso é Mediator! O restante da descrição também está certo. Gabarito: C 21. (CESPE - 2012 - BASA - Tecnologia da Informação – Técnico Científico) O padrão adapter define uma família de algoritmos, permite o encapsulamento de algoritmos e possibilita a substituição desses algoritmos. Os algoritmos podem variar independentemente dos seus clientes. Esse padrão pode ser usado quando várias classes relacionadas diferirem apenas nos seus comportamentos. Comentários: Strategy: define uma família de algoritmos, encapsula cada um e faz deles intercambiáveis. Família de algoritmos? Opa, isso é Strategy! Gabarito: E (CESPE - TCE-RN – Assessor Técnico de Informática) O template method se aplica primariamente às classes, sendo um padrão de projeto com finalidade comportamental, ou seja, caracterizado pela maneira como as classes interagem e distribuem responsabilidades. 16712855225
Comentários: Template Method: define o esqueleto de um algoritmo dentro de uma operação, deixando alguns os a serem preenchidos pelas subclasses. Questão perfeita! Alguns métodos se aplicam primariamente às classes, como: Template Method, Interpreter, Adapter e Factory Method. O restante se aplica primariamente a objetos. Gabarito: C
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 31 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - 2010 – TRT/RN – Técnico Judiciário – Tecnologia da Informação) Os padrões de projeto podem ser definidos como soluções já testadas para problemas que ocorrem frequentemente durante o projeto de software. Comentários: E o que seriam Padrões de Projeto (do inglês, Design Patterns)? Respondo: são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico em um contexto específico. Esses padrões nomeiam, abstraem e identificam aspectos comuns em uma estrutura e os torna úteis para que sejam realizados. Como é isso, professor? Apenas a definição! Fácil, fácil, né?! Gabarito: C 24. (CESPE - 2007 - TST - Analista Judiciário – Análise de Sistemas) Um dos mecanismos da orientação a objetos para reutilização de software é a identificação e documentação de padrões de projeto (design patterns), que são modelos particulares de classes e de objetos comunicantes que se repetem de um projeto para outro e que podem assim ser padronizados. Comentários: E o que seriam Padrões de Projeto (do inglês, Design Patterns)? Respondo: são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico em um contexto específico. Esses padrões nomeiam, abstraem e identificam aspectos comuns em uma estrutura e os torna úteis para que sejam realizados. Como é isso, professor? 16712855225
Definição de Design Pattern! Gabarito: C (CESPE - 2006 – DATAPREV - Analista de Sistemas) As seguintes situações justificam o uso do padrão Abstract Factory: o sistema deve ser independente de como os objetos são criados; o sistema deve poder ser configurado com diferentes famílias de classes; é necessário garantir que certas classes sejam usadas em conjunto. Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 32 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Abstract Factory: fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. Família de classes/objetos? Opa, Abstract Factory! Gabarito: C (CESPE - 2006 – DATAPREV - Analista de Sistemas) As seguintes situações justificam o uso do padrão Adapter: é necessário um objeto local que se faça ar por um objeto localizado em outro espaço de endereçamento; é necessário controlar o o a um objeto; um objeto persistente deve ser carregado em memória somente quando for referenciado. Comentários: Proxy: provê um substituto ou ponto através do qual um objeto pode controlar o o a outro objeto. Controlar o o a um objeto? Proxy! Gabarito: E 27. (CESPE - 2006 – DATAPREV - Analista de Sistemas) As seguintes situações justificam o uso do padrão Command: um conjunto de objetos se comunica de forma definida porém complexa, o que resulta em interdependências difíceis de serem entendidas; o reúso está sendo dificultado pois cada objeto se comunica com vários outros objetos. 16712855225
Comentários: Mediator: define um objeto que encapsula a forma como um conjunto de objetos interagem, promovendo um fraco acoplamento ao evitar que objetos se refiram aos outros explicitamente. Pessoal, esse padrão de projeto deve ser utilizado quando um conjunto de objetos se comunicar de maneira bem definida, porém complexa e quando o reúso de um objeto for difícil por referenciar e se comunicar com muitos outros objetos. Forma bem definida, porém complexa? Mediator!
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 33 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Gabarito: E (CESPE - 2006 – DATAPREV - Analista de Sistemas) As seguintes situações justificam o uso do padrão Strategy: é necessário configurar uma classe com uma variedade de comportamentos; uma classe usa diferentes variações de um algoritmo; o método de uma classe tem muitos enunciados condicionais pois a classe tem comportamentos variados. Comentários: Strategy: define uma família de algoritmos, encapsula cada um e faz deles intercambiáveis. Ele também é utilizado quando uma classe definir muitos comportamentos e eles aparecerem como declarações condicionais em suas operações. Variações de algoritmo? Strategy! Gabarito: C (CESPE – DATAPREV - Analista de Sistemas) Quanto aos padrões de projeto orientados a objetos, assinale a opção correta. a) O Facade pode ser usado quando se deseja prover uma interface simples para um subsistema complexo; existem muitas dependências entre clientes e as classes que implementam uma abstração. b) Pode-se usar o Decorator quando um sistema deve ser configurado com uma entre várias famílias de produtos; uma família de produtos relacionados foi projetada para ser usada em conjunto. 16712855225
c) O Adapter pode ser usado quando objetos se comunicam de forma definida, mas complexa; as interdependências entre os objetos são difíceis de entender; o reúso está sendo dificultado, pois um objeto se comunica com vários outros. d) Pode-se usar o Builder quando o comportamento de um objeto muda em tempo de execução e depende do seu estado; as operações têm múltiplos enunciados condicionais que dependem do estado do objeto. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 34 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Pessoal, esse padrão de projeto deve ser utilizado quando se desejar fornecer uma interface simples para um subsistema complexo ou quando se quer dividir em camadas os subsistemas. É também utilizando quando há muitas dependências entre clientes e as classes de implementação de uma abstração. Conforme visto em aula, trata-se do Façade. A letra B (Abstract Factory); a Letra C (Mediator); a Letra D (State). Gabarito: A (CESPE 1– - Analista de Sistemas) O padrão Singleton garante que uma classe tenha somente uma instância, fornecendo, assim, um ponto global de o a essa instância. Comentários: Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. Conforme visto em aula, está perfeito! Gabarito: C 31. (CESPE - 2011 – MEC - Analista de Sistemas) O padrão Prototype pode ser usado no desenvolvimento de programas escritos com a linguagem PHP 5.0, atuando como padrão estrutural que permite construir tanto classes quanto objetos. Comentários: 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 35 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Conforme visto em aula, trata-se de um padrão criacional e, não, estrutural. Gabarito: E (CESPE - 2011 – MEC alista de Sistemas) Os padrões de projeto são úteis tanto na fase de planejamento da arquitetura quanto na de desenvolvimento e codificação. Comentários: Perfeito! Ele é útil na fase de planejamento (Padrão de Projeto), mas também é útil na fase de codificação. Gabarito: C 16712855225
(CESPE - 2011 – MEC - Analista de Sistemas) O padrão Abstract Factory é corretamente aplicável, quando necessário, para fornecer uma biblioteca de classes e não revelar suas interfaces. Comentários: Abstract Factory: fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 36 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
A questão está errada, porque deve-se revelar apenas suas interfaces e, não, suas classes concretas. Não sei se não entraram com recurso ou se a banca não quis trocar o gabarito, mas no gabarito oficial veio como verdadeiro. Gabarito: C 34. (CESPE - 2013 – MPOG - Analista de Sistemas) O padrão de comportamento e encadeamento de atendentes (chain of responsibility) evita acoplamento entre solicitantes e atendentes, permitindo que mais de um objeto tenha chance de tratar a solicitação. Comentários: Chain of Responsability: evita o acoplamento do remetente de uma requisição ao seu receptor ao dar a mais de um objeto a chance de lidar com a requisição. Evita o acoplamento entre solicitantes e atendentes? É Chain of Responsability! Gabarito: C (CESPE - 2013 – MPOG - Analista de Sistemas) Para um problema recorrente no desenvolvimento de sistemas, normalmente, um padrão de projeto descreve uma solução geral, que não pode ser reutilizada. Comentários: E o que seriam Padrões de Projeto (do inglês, Design Patterns)? Respondo: são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico em um contexto específico. Esses padrões nomeiam, abstraem e identificam aspectos comuns em uma estrutura e os torna úteis para que sejam realizados. Como é isso, professor? 16712855225
Conforme visto em aula, são soluções gerais para problemas recorrentes e, portanto, podem ser reutilizadas. Gabarito: E (CESPE - 2013 – MPOG - Analista de Sistemas) Padrões de projeto envolvem combinações de classes e algoritmos associados que cumprem com propósitos comuns de projeto.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 37 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Comentários: E o que seriam Padrões de Projeto (do inglês, Design Patterns)? Respondo: são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico em um contexto específico. Esses padrões nomeiam, abstraem e identificam aspectos comuns em uma estrutura e os torna úteis para que sejam realizados. Como é isso, professor? Conforme visto em aula, eles resolvem problemas comuns ou recorrentes. Gabarito: C 37. (CESPE – 2008 – STF - Analista de Sistemas) A figura acima, adaptada de java.sun.com, ilustra a arquitetura de uma aplicação web desenvolvida na plataforma J2EE, tendo sido alguns de seus módulos nomeados de A até I. Considere que uma aplicação com a arquitetura mostrada tenha sido instalada em um servidor de aplicação JBoss 4.0 ou superior, por meio do deploy de um arquivo com nome aplicação.war, e se encontrem pleno funcionamento. Conforme a nomenclatura proposta pelo GoF (Gang of Four) book, o nome dado ao módulo F sugere que esse módulo implementa um padrão da categoria comportamental, enquanto o nome do módulo C sugere que ele implementa um padrão da categoria estrutural. Comentários:
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 38 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Pessoal, F é Command! Command é comportamental? Sim. C é Composite! Composite é estrutural? Sim. Gabarito: C (CESPE – TCU - Analista de Sistemas Nos padrões de projeto (design patterns) estruturais, utilizam-se técnicas que valorizam um forte acoplamento entre as classes para favorecer o aprendizado e a portabilidade das aplicações. Comentários:
BENEFÍCIOS E VANTAGENS DOS PADRÕES DE PROJETO Utilizam polimorfismo, herança, modularidade, composição, abstração para construir código reutilizável, eficiente, de alta coesão e baixo acoplamento. Conforme vimos em aula, valoriza-se o fraco/baixo acoplamento. Gabarito: E ACERTEI
ERREI
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 39 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(FCC - 2011 - TCE-PR - Analista de Controle – Informática - A) Os design patterns: a) são projetos de arquitetura para um domínio específico de aplicação e sempre trazem componentes predefinidos que envolvem código de programação. b) consistem em conjuntos de classes que um usuário instancia para utilizar seus métodos. Após a chamada ao método, o controle do fluxo da aplicação retorna para o usuário. c) são de uso exclusivo em processos de desenvolvimento de soluções orientado a objetos, já que os objetos são a mais adequada abstração para o reúso. d) são aplicações propriamente ditas, normalmente construídas pela integração de diversos frameworks. e) podem ser modelados utilizando-se a linguagem UML que fornece um meio eficiente de modelar padrões de projeto representando-os como colaborações. Comentários: a) Domínio específico? Não, trata-se de domínio genérico! Sempre trazem código? Também não! 16712855225
b) Design Patterns não consistem em conjuntos de classes! Aliás, quem falou em orientação a objetos? A questão se refere a Design Patterns em geral. c) Galera, lembrem-se de que Padrões de Projeto (GOF) são orientados a objetos, mas a questão não especificou – ela disse bem genericamente. d) Aplicações, não! São modelos, descrições, etc. Galera, padrões de projeto são muito mais abstratos do que aplicações.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 40 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
e) Perfeito, pode-se utilizar a Linguagem UML. Ademais, é possível representá-los de diversas maneiras, inclusive com colaborações. Gabarito: E (FCC - 2010 - TRF - 4ª REGIÃO - Analista Judiciário - Tecnologia da Informação) Sobre os design patterns, é correto afirmar: a) Padrões e linguagens de padrões são maneiras de implementar sistemas orientados a objetos por meio da captação da experiência de programadores. Os padrões, apesar de abstratos, sempre incluem algum código de programação. b) São aplicações, propriamente ditas, dedicadas aos domínios de aplicações específicos, tais como sistemas de telecomunicações ou financeiros. c) Não são complexos e necessita-se de um tempo mínimo para aprender a usálos. d) O princípio geral de englobamento de experiência em um padrão é aplicável apenas à abordagem de projeto de software orientado a objetos. e) O padrão é uma descrição de conhecimento e experiência acumulados, uma solução comprovada para um problema comum. Comentários: a) Sempre incluem algum código de programação? Não! 16712855225
b) Padrões de Projeto não são aplicações propriamente ditas. c) Afirmar que não são complexos é perigoso! Há padrões bastante complicados. d) De novo, não! Padrões de Projeto não se limitam a orientação a objetos. e) É isso mesmo! Questão perfeita! Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 41 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(FCC - -PI - Analista Judiciário - Tecnologia da Informação) Os padrões de projeto, quando aplicados ao desenvolvimento de aplicações, fornecem meios de descrever soluções comuns para problemas comuns, resultando em redução de tempo gasto com o desenvolvimento e melhoria da qualidade da aplicação. Analise: I. É o responsável pela especificação dos tipos de objetos a serem criados usando uma "instância" prototípica e pela criação de novos objetos copiando este protótipo. II. Define uma interface de nível mais alto que torna o subsistema mais fácil de usar e fornece uma interface única para um subsistema com diversas interfaces; compõe o grupo de padrões estruturais. III. Integrante do grupo de padrões comportamentais, ele provê uma forma de ar sequencialmente os elementos de um agregado de objetos, sem expor a representação interna desse agregado. IV. As consequências do uso deste padrão é que o encapsulamento é mantido, já que objetos usam sua própria informação para cumprir responsabilidades; leva ao fraco acoplamento entre objetos e à alta coesão, uma vez que objetos fazem tudo que é relacionado à sua própria informação. As afirmações correspondem, respectivamente, aos padrões a) Command, Iterator, Singleton e Expert. b) Controller, Expert, Singleton e Prototype. c) Command, Singleton, Controller e Façade. d) Prototype, Façade, Iterator e Expert. e) Adapter, Façade, Command e Iterator. 16712855225
Comentários: Prototype: especifica os tipos de objetos para criar usando uma instância como protótipo e cria novos objetos copiando este protótipo. (I) Instância prototípica? Prototype! Façade: oferece uma interface unificada para um conjunto de interfaces em um subsistema, definindo uma interface de alto nível que facilita o uso do subsistema. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 42 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(II) Interface de nível mais alto? Façade. Iterator: fornece uma maneira de ar elementos de um objeto agregado sequencialmente sem expor sua representação interna. (III) Provê forma de ar sequencialmente? Iterator. (IV) Expert? Isso é Padrão GRASP e, não, GOF (é outro assunto!). Gabarito: D (FCC - 2009 - -PI - Analista Judiciário - Tecnologia da Informação) Acerca desses padrões, avalie: I. Em termos de padrões de criação de projetos, algumas classes, tais como um spooler de impressão ou um sistema de arquivos, devem ser instanciadas uma única vez e prover um ponto de o global a esta instância. II. Pertencente ao grupo de padrões estruturais, é utilizado para permitir que dois objetos se comuniquem mesmo que tenham interfaces incompatíveis. III. Encapsula uma requisição como um objeto, permitindo que os clientes parametrizem diferentes requisições e filas, ou façam o registro de log de requisições e dêem e a operações que podem ser desfeitas. IV. Atribuir a responsabilidade do tratamento de um evento do sistema a uma classe que representa o próprio sistema ou à classe que representa um caso de uso. 16712855225
As proposições correspondem, respectivamente, aos padrões a) Singleton, Adapter, Command e Controller. b) Command, Iterator, Singleton e Expert. c) Façade, Iterator, Expert e Adapter. d) Controller, Expert, Singleton e Prototype. e) Adapter, Façade, Command e Iterator. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 43 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. (I) Ponto de o global? Singleton. Adapter: converte a interface de uma classe em outra interface que normalmente não poderiam trabalhar juntas por serem incompatíveis. (II) Interfaces incompatíveis? Adapter. Command: encapsula a requisição de um objeto, portanto permitindo que se parametrize os clientes com diferentes requisições. (III) Encapsula requisição como um objeto? Command. (IV) Controller? Isso é Padrão GRASP e, não, GOF (é outro assunto!). Gabarito: A (FCC - 2011 - TRT - 24ª REGIÃO (MS) - Analista Judiciário - Tecnologia da Informação) Considere: I. Fornecer uma interface para criação de famílias de objetos relacionados ou dependentes, sem especificar suas classes concretas. Possibilitar o adiamento da instanciação para as subclasses. II. Garantir a existência de apenas uma instância de uma classe, mantendo um ponto global de o ao seu objeto. 16712855225
III. Possibilitar o armazenamento do estado interno de um objeto em um determinado momento, para que seja possível retorná-lo a este estado, caso necessário. I, II e III são, respectivamente, objetivos dos Design Patterns intitulados: a) Interpreter, Iterator e Memento. b) Command, Singleton e Iterator. c) Factory Method, Singleton e Memento. d) Iterator, Factory Method e Flyweight. e) Singleton, Flyweight e Command. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 44 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Comentários: Factory Method: define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar. (I) Na minha opinião, houve confusão da FCC! Factory Method fornece uma interface para criar um objeto, possibilitando o adiamento da instanciação para as subclasses. Já o Abstract Factory fornece uma interface para criar uma família de objetos, relacionados ou dependentes, sem especificar suas classes concretas. Ou seja, a FCC misturou ambas as definições, no entanto considerou como Factory Method; Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. (II) Ponto global de o? Ficou fácil: Singleton; Memento: captura e externaliza o estado interno de um objeto, sem violar seu encapsulamento, de maneira que o objeto possa ser restaurado posteriormente. (III) Armazenar estado interno de um objeto para retornar, se necessário? Ficou fácil: Memento. Gabarito: C (FCC - 2011 - TRE-RN - Técnico Judiciário - Programação de Sistemas) Na engenharia de software, os padrões de projetos comportamentais tratam das interações e divisões de responsabilidades entre as classes ou objetos. São exemplos típicos dessa família: 16712855225
a) Command, Factory Method e Prototype. b) Builder, Prototype e Singleton. c) Chain of Responsability, Interpreter e Iterator. d) Adapter, Bridge e Façade. e) Abstract Factory, Builder e Composite. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 45 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(a) Factory Method e Prototype são Criacionais; (b) Todos são Criacionais; (c) Todos são Comportamentais; (d) Todos são Estruturais; (e) Todos são Criacionais. Gabarito: C (FCC - 2011 - TRT - 4ª REGIÃO (RS) - Analista Judiciário - Tecnologia da Informação) O catálogo de padrões de projeto (Design Patterns) do GoF contém: a) 20 padrões e está basicamente dividido em duas seções: Structural e Behavioral. b) 21 padrões e está basicamente dividido em duas seções: Creational e Behavioral. c) 23 padrões e está basicamente dividido em duas seções: Structural e Behavioral. d) 23 padrões e está, basicamente, dividido em três seções: Creational, Structural e Behavioral. e) 24 padrões e está basicamente dividido em três seções: Creational, Spectral e Behavioral. 16712855225
Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 46 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
23 Padrões de Projeto, dividido em Criacional, Estrutural e Comportamental. Gabarito: D (FCC - 2011 - TRT - 14ª Região (RO e AC) - Analista Judiciário - Tecnologia da Informação) No contexto dos padrões de projeto: I. Oferecer uma interface simples para uma coleção de classes. II. Desacoplar uma abstração de sua implementação para que ambas possam variar independentemente. Correspondem respectivamente a: a) Façade e Bridge. b) Adapter e Façade. c) Composite e Bridge. d) Façade e Composite. e) Bridge e Adapter.
16712855225
Comentários: Façade: oferece uma interface unificada para um conjunto de interfaces em um subsistema, definindo uma interface de alto nível que facilita o uso do subsistema. Bridge: desacopla uma interface de sua implementação, de forma que ambas possam variar independentemente.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 47 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Quem oferece uma interface simples para uma coleção de classes é o Façade e quem desacopla uma abstração de sua implementação para que ambas possam várias independentemente é o Bridge. Gabarito: A (FCC - Infraero - Analista de Sistemas As associações entre classes e objetos são tratadas pelos Padrões de Projeto de Software (Design Patterns) da família de Padrões: a) GoF Estruturais. b) GRASP Comportamentais. c) GRASP Estruturais. d) GoF de Criação. e) GoF Comportamentais. Comentários: Os Padrões Criacionais abstraem o processo de criação de objetos a partir da instanciação de classes. Já os Padrões Estruturais tratam da forma como classes e objetos estão organizados para formar estruturas maiores. Por fim, Padrões Comportamentais se preocupam com os algoritmos e responsabilidades dos objetos, que ocorrem em tempo de execução. Conforme vimos em aula, a associação entre classes e objetos é tratada por Padrões GoF Estruturais. 16712855225
Gabarit
A
10. (FCC - 2013 – DPE/SP - Analista de Sistemas) Um design pattern descreve uma solução geral comprovada e reutilizável para um problema recorrente no desenvolvimento de sistemas de software orientados a objetos. Padrões de projeto ajudam a reconhecer e implementar boas soluções para problemas comuns. Dois dos principais design patterns utilizados atualmente são descritos a seguir: I. Visa garantir que uma classe só tenha uma única instância e prover um ponto de o global a ela.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 48 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
II. Visa definir uma dependência um-para-muitos entre objetos para que quando um objeto mudar de estado os seus dependentes sejam notificados e atualizados automaticamente. Os design patterns descritos em I e II são, respectivamente: a) Singleton e Observer. b) Facade e Adapter. c) Composite e Adapter. d) Singleton e Command. e) Facade e Observer. Comentários: Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. (I) Ponto de o global? Singleton! Observer: define uma dependência um-para-muitos entre objetos para que, quando um objeto mudar de estado, os seus dependentes sejam notificados e atualizados automaticamente. (II) Dependentes notificados automaticamente? Observer. Gabarito: A 11. (FCC - 2013 – TRT/15 - Analista de Sistemas) Os padrões Gang of Four (GoF) organizam um conjunto de padrões de projeto (design patterns) em três grupos: de criação, estruturais e comportamentais. Três destes padrões são descritos a seguir: 16712855225
I. Em situações em que classes precisam trabalhar juntas, mas isto não está sendo possível porque suas interfaces são incompatíveis, pode-se utilizar este design pattern que permite converter a interface de uma classe em outra interface esperada pelos clientes de forma que classes com interfaces incompatíveis possam interagir.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 49 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
II. Este design pattern pode ser utilizado quando se deseja definir uma dependência um-para-muitos entre objetos de modo que quando um objeto muda o estado, todos seus dependentes são notificados e atualizados. III. Em situações em que se deseja ar o conteúdo de uma coleção sem expor sua representação interna utiliza-se este design pattern que permite prover uma interface única para varrer coleções diferentes. Os padrões descritos nos itens I, II e III são, respectivamente, a) Adapter, Facade e Strategy. b) Prototype, Composite e Command. c) Abstract Factory, Observer e Iterator. d) Adapter, Observer e Iterator. e) Abstract Factory, Composite e Command. Comentários: Adapter: converte a interface de uma classe em outra interface que normalmente não poderiam trabalhar juntas por serem incompatíveis. (I) Interfaces incompatíveis? Adapter! Observer: define uma dependência um-para-muitos entre objetos para que, quando um objeto mudar de estado, os seus dependentes sejam notificados e atualizados automaticamente. (II) Quando um objeto muda o estado, todos os seus dependentes são notificados e atualizados? Observer! 16712855225
Iterator: fornece uma maneira de ar elementos de um objeto agregado sequencialmente sem expor sua representação interna. (III) Deseja ar o conteúdo de uma coleção? Iterator. Gabarito: D 12. (FCC – 2013 – AL/RN– Analista de Sistemas Analise as seguintes afirmações:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 50 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
I. Fornece uma interface para a criação de uma família de objetos relacionados ou dependentes sem fornecer os detalhes de implementação das classes concretas. II. Converte uma interface de uma classe existente em outra interface esperada pelos clientes. Permite que algumas classes com interfaces diferentes trabalhem em conjunto. III. Separa uma implementação de sua abstração, de forma que ambas possam variar independentemente. IV. Separa a construção de um objeto complexo de sua representação, de modo que o mesmo processo possa criar representações diferentes. Tratam, respectivamente, dos design patterns: a) Builder − Adapter − Bridge − Abstract Factory. b) Abstract Factory − Adapter − Bridge − Builder. c) Bridge − Adapter − Builder − Abstract Factory. d) Adapter − Builder − Abstract Factory − Bridge. e) Builder − Bridge − Abs tract Factory − Adapter. Comentários: Abstract Factory: fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. (I) Conforme visto em aula, trata-se do Abstract Factory. 16712855225
Adapter: converte a interface de uma classe em outra interface que normalmente não poderiam trabalhar juntas por serem incompatíveis. (II) Conforme visto em aula, trata-se do Adapter. Bridge: desacopla uma interface de sua implementação, de forma que ambas possam variar independentemente. (III) Conforme visto em aula, trata-se do Bridge.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 51 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Builder: separa a construção de um objeto complexo da sua representação, de forma que o mesmo processo de construção possa criar diferentes tipos de representações. (IV) Conforme visto em aula, trata-se do Builder. Gabarito: B ACERTEI
ERREI
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 52 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(ESAF - 2005 – AFRFB - Analista de Sistemas) Analise as seguintes afirmações relacionadas a padrões de projetos: I. O padrão Builder separa a construção de um objeto complexo de sua representação, de modo a que o mesmo processo de construção possa criar diferentes representações. II. O método Abstract Factory fornece uma interface para a criação de uma família de objetos relacionados ou dependentes sem especificar suas classes completas. III. O padrão Bridge define uma interface para criar um objeto, mas deixa as subclasses decidirem que classe será instanciada. O Bridge permite a uma classe postergar a instanciação das subclasses. IV. O Chain of responsability usa compartilhamento para ar grandes quantidades de objetos e define uma dependência um-para-muitos entre objetos, de modo que quando um objeto muda de estado, todos os seus dependentes são automaticamente notificados e atualizados. Indique a opção que contenha todas as afirmações verdadeiras. 16712855225
a) I e III. b) II e III. c) III e IV. d) I e II. e) II e IV. Comentários: Builder: separa a construção de um objeto complexo da sua representação, de forma que o mesmo processo de construção possa criar diferentes tipos de representações.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 53 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(I) Contrução de um objeto complexo? Builder! Abstract Factory: fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. (II) Interface para a criação de uma família de objetos relacionados? Abstract Factory! Observem que ele diz completa, em vez de concreta! Nesse contexto, os termos são sinônimos, i.e., a classe concreta é completa, na medida em que contém todas as implementações de seus métodos, por outro lado uma classe abstrata seria incompleta. Factory Method: define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar. (III) Interface para criar objeto deixando a decisão para subclasses? Factory Method! Flyweight: usa compartilhamento para ar eficientemente grandes quantidades de objetos de baixa granularidade. Observer: define uma dependência um-para-muitos entre objetos para que, quando um objeto mudar de estado, os seus dependentes sejam notificados e atualizados automaticamente. (IV) A questão misturou Flyweight com Observer. Gabarito: D (ESAF – 2008 – CGU - Analista de Sistemas) Ao longo das últimas décadas, a engenharia de software fez progressos significativos no campo de padrões de projeto – arquiteturas comprovadas para construir software orientado a objetos flexível e fácil de manter. Com relação ao padrão Facade, é correto afirmar que: 16712855225
a) Fornece um objeto representante ou um marcador de outro objeto para controlar o o ao mesmo. b) Define o esqueleto de um algoritmo em uma operação, postergando a definição de alguns os para subclasses. c) Define uma interface para criar um objeto, mas deixas as subclasses decidirem qual classe a ser instanciada. d) Fornece uma interface unificada para um conjunto de interfaces em um sistema. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 54 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
e) Define uma dependência “um para muitos” entre objetos, de modo que, quando um objeto muda de estado, todos os seus dependentes são automaticamente notificados e atualizados. Comentários: Proxy: provê um substituto ou ponto através do qual um objeto pode controlar o o a outro objeto. (a) Conforme vimos em aula, trata-se do Proxy. Template Method: define o esqueleto de um algoritmo dentro de uma operação, deixando alguns os a serem preenchidos pelas subclasses. (b) Conforme vimos em aula, trata-se do Template Method. Factory Method: define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar. (c) Conforme vimos em aula, trata-se do Factory Method. Façade: oferece uma interface unificada para um conjunto de interfaces em um subsistema, definindo uma interface de alto nível que facilita a utilização do subsistema. (d) Conforme vimos em aula, trata-se do Façade (Resposta Correta). Observer: define uma dependência um-para-muitos entre objetos para que, quando um objeto mudar de estado, os seus dependentes sejam notificados e atualizados automaticamente. 16712855225
(e) Conforme vimos em aula, trata-se do Observer. Gabarito: D (ESAF – – CGU - Analista de Sistemas Quanto à finalidade, os padrões de projeto podem ser classificados em padrões de criação, padrões de estutura ou padrões comportamentais. Correspondem à categoria de padrões estruturais: a) Facade, Prototype e Proxy. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 55 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
b) Adapter, Composite e Proxy. c) Adapter, Factory Method e Template Method. d) Builder, Template Method e Strategy. e) Adapter, Bridge e Singleton. Comentários:
Conforme vimos em aula, trata-se do Adapter, Composite e Proxy. Gabarito: B
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 56 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(FGV – 2008 – AL - Analista de Sistemas Considera as seguintes assertivas sobre as vantagens do uso de padrões de software (software patterns): I. Padrões de projeto proporcionam um vocabulário comum de projeto, facilitando comunicação, documentação e aprendizado dos sistemas de software. II. Padrões de projeto auxiliam no desenvolvimento de software por meio da reutilização do projeto de soluções computacionais já testadas e aprovadas. III. Uma biblioteca de padrões pode ajudar a melhorar e padronizar o desenvolvimento de software. As assertivas corretas são: a) somente II. b) somente I e II. c) somente I e III. d) somente II e III. e) I, II e III. Comentários: (I) Sim, eles possuem um jargão próprio comum a todos: nome, problema, solução e consequências. Suponham que haja uma fábrica de software que desenvolve diversos sistemas para as mais variadas áreas de negócio. Sabe-se que, mesmo em áreas aparentemente distintas ou contrastantes, grande parte dos problemas já possuem uma solução conhecida, formalmente documentada e exaustivamente testada, uma vez que se tratam de problemas recorrentes. 16712855225
(II) Sim, conforme visto em aula. Pessoal, vamos iniciar pelo básico! O que é um Padrão? É um modelo testado ou documentado para se alcançar um determinado objetivo. O autor Christopher Alexander afirma que cada padrão descreve um problema que ocorre repetidas vezes em nosso ambiente e o núcleo de sua solução, de tal forma que ela pode ser usada diversas vezes sem que seja realizada da mesma maneira. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 57 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(III) Sim, conforme visto em aula. Imaginem que, em uma equipe de programadores, todos utilizam um determinado padrão de projeto, mas cada um à sua maneira. Não seria melhor ter uma biblioteca de padrões a fim de padronizar e melhorar o desenvolvimento de software? Gabarito: E (ESAF – 2012– CGU – Analista de Sistemas O padrão de projeto singleton é usado para restringir: a) a instanciação de uma classe para objetos simples. b) a instanciação de uma classe para apenas um objeto. c) a quantidade de classes. d) as relações entre classes e objetos. e) classes de atributos complexos. Comentários: Singleton: garante que uma classe tenha apenas uma instância e provê um ponto de o global a ela. Conforme vimos em aula, ele restringe a instanciação de uma classe para apenas um objeto ou instância. Gabarito: B (FEMPER – 2012 – TCE/RJ – Analista de Sistemas Padrões de Projeto descrevem soluções para problemas recorrentes no desenvolvimento de sistemas de software orientados a objetos. Um padrão de projeto estabelece um nome e define o problema, a solução, quando aplicar esta solução e suas consequências. Um dos padrões de projeto mais utilizados é o padrão Adapter (adaptador), que tem como função: 16712855225
a) garantir a existência de apenas uma instância de uma classe, mantendo um ponto global de o ao seu objeto. b) adicionar dinamicamente um comportamento a um objeto existente sem alterar o código das classes existentes.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 58 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
c) fornecer uma interface para a criação de famílias de objetos correlatos ou dependentes sem a necessidade de especificar a classe concreta destes objetos. d) definir novas operações sem alterar as classes dos elementos sobre os quais ele opera. e) permitir que classes com interfaces incompatíveis possam interagir. Comentários: Singleton: garante que uma classe tenha apenas uma instância e provê um o global a ela.
nto de
(a) Conforme visto em aula, trata-se do Singleton. Decorator: anexa responsabilidades adicionais a um objeto dinamicamente. Fornece uma alternativa flexível em relação à herança para estender funcionalidades. (b) Conforme visto em aula, trata-se do Decorator. Abstract Factory: fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. (c) Conforme visto em aula, trata-se do Abstract Factory. Visitor: representa uma operação a ser realizada sobre elementos de uma estrutura de objetos e permite definir uma nova operação sem mudar as classes dos elementos sobre os quais opera. 16712855225
(d) Conforme visto em aula, trata-se do Visitor. Adapter: converte a interface de uma classe em outra interface que normalmente não poderiam trabalhar juntas por serem incompatíveis. (e) Conforme visto em aula, trata-se do Adapter (Questão Correta). Gabarito: E (ESAF – 2012– ATRFB – Analista de Sistemas) Os padrões de projeto (Design Patterns) são classificados nas categorias: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 59 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
a) Situacional. Estrutural. Complementar. b) Criacional. Evolutiva. Contingencial. c) Compartimental. Vinculada. Comportamental. d) Criacional. Step-by-step. Orientada a requisitos. e) Criacional. Estrutural. Comportamental. Comentários:
Conforme vimos em aula, classifica-se em Criacional, Estrutural ou Comportamental. Gabarito: E (FGV – 2013 – AL/MA – Analista de Sistemas Com relação ao tema Padrões de Projeto, conforme descritos por Gamma et Alli, sobre o padrão Prototype, analise as afirmativas a seguir. 16712855225
I. Apresenta como benefícios adicionais a adição e a remoção de produtos em tempo de execução. II. Apresenta como benefícios adicionais a especificação de novos objetos pela variação de seus valores e/ou de sua estrutura. III. Apresenta como benefícios adicionais a redução da necessidade de criação de subclasses. Assinale:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 60 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
a) se somente a afirmativa I estiver correta. b) se somente a afirmativa II estiver correta. c) se somente a afirmativa III estiver correta. d) se somente as afirmativas I e II estiverem corretas. e) se todas as afirmativas estiverem corretas. Comentários: Entre os benefícios adicionais decorrentes da utilização desse padrão, inserem-se: acrescenta e remove produtos em tempo de execução; reduz o número de subclasses; configura dinamicamente uma aplicação com classes; especifica novos objetos pela variação de valores; e especifica novos objetos pela variação da estrutura. Bacana, pessoal? Conforme visto em aula, todas as alternativas estão corretas. Gabarito: E (FGV – 2015 – AL/Caruaru – Analista de Sistemas) O catálogo denominado Padrões GoF (‘Gang of Four’) define soluções reutilizáveis para problemas frequentes em projetos de sistemas de software. Essas soluções estão organizadas em três famílias conforme o propósito de cada solução. Os padrões de projetos denominados Interpreter, Prototype e Flyweight que fazem parte desse catálogo, pertencem, respectivamente, às seguintes famílias: a) padrão comportamental, padrão de criação e padrão estrutural. b) padrão estrutural, padrão comportamental e padrão de criação. c) padrão comportamental, padrão estrutural e padrão de criação. d) padrão estrutural, padrão de criação e padrão comportamental. e) padrão de criação, padrão comportamental e padrão estrutural. 16712855225
Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 61 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Vocês decoraram as frases? Interpreter não está nas frases, então é um Diagrama Comportamental; Prototype está na primeira frase, então é um Diagrama de Criação; Flyweight está na segunda frase, então é um Padrão de Estrutural. Gabarito: A ACERTEI
ERREI
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 62 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
PADRÕES JAVA EE Os Padrões de Projeto têm o intuito de propor e catalogar soluções a problemas recorrentes na criação de projetos de software orientados a objeto, com base em soluções já empregadas com sucesso em projetos. Vários programadores foram verificando que havia soluções muito parecidas para uma grande categoria de problemas e, então, foram documentando! Pode-se dizer que um padrão de projeto nada mais é do que a documentação de uma possível solução de um problema em um contexto comum, podendo assim ser adaptado integralmente às necessidades de um problema específico. Em geral, a estrutura de um padrão de projeto é composta por quatro elementos: nome do padrão; problema a solucionar; solução proposta; e consequências da utilização. Na maioria das vezes, os padrões são utilizados em conjunto, onde cada um assume uma responsabilidade no contexto do problema. Com isso é necessário que os padrões sejam organizados e classificados de modo a serem documentados. A classificação dos padrões pode ser definida por dois critérios. O primeiro critério refere-se à finalidade do padrão, ou seja, o que o padrão se propõe a fazer. Com a evolução e maturidade da tecnologia Java EE, o centro de tecnologia Sun Java Center vem identificando e propondo soluções para problemas semelhantes ocorridos em projetos de software. A estratégia adotada para os problemas foi definir um padrão e documentar em alto nível de abstração as possíveis soluções a serem utilizadas. A Plataforma Java EE define um padrão de arquitetura de três camadas para o desenvolvimento de aplicações web, como mostra a imagem abaixo. 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 63 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
A Camada de Apresentação comporta as aplicações web desenvolvidas em Java que terão o aos componentes de negócio. Por exemplo, é nessa camada que ficam as JSF e Páginas JSP. Na Camada de Negócio, encontram-se os componentes que implementam as regras de negócio específicas do sistema. É lá que se encontram os Enterprise JavaBeans (EJB). Por fim, temos a Camada de Integração (ou EIS), em que se encontram fontes de informação como banco de dados, o aos dados de sistemas legados, entre outras fontes externas. Por exemplo, é nessa camada que se encontra toda a parte de persistência de objetos em que se emprega a tecnologia JPA. Da mesma maneira que se dividiu a Arquitetura Java EE, dividem-se os Padrões Java EE.
CAMADA DE APRESENTAÇÃO
CAMADA DE NEGÓCIO
CAMADA DE INTEGRAÇÃO
INTERCEPTING FILTER
BUSINESS DELEGATE
DATA ACCESS OBJECT
FRONT CONTROLLER
SERVICE LOCATOR
SERVICE ACTIVATOR
CONTEXT OBJECT
SESSION FAÇADE
DOMAIN STORE
APPLICATION CONTROLLER
APPLICATION SERVICE
WEB SERVICE BROKER
VIEW HELPER
BUSINESS OBJECT
COMPOSITE VIEW
COMPOSITE ENTITY
SERVICE TO WORKER
TRANSFER OBJECT
DISPATCHER VIEW
VALUE LIST HANDLER 16712855225
TRANSFER OBJECT ASSEMBLER
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 64 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02 CAMADA DE APRESENTAÇÃO
Intercepting Filter Front Controller Context Object Application Controller View Helper Composite View Service to Worker Dispatcher View
Utilizado para interceptar e manipular uma requisição e uma resposta antes e depois de a requisição ser processada. Utilizado para centralizar o controle do gerenciamento das requisições HTTP. Utilizado para encapsular informações de forma independente de protocolo de comunicação para compartilhamento pela aplicação. Utilizado para centralizar e modularizar o gerenciamento de visões e ações. Utilizado para encapsular a formatação e o processamento de exibição de dados em uma página web. Utilizado para criar visões compostas de componentes menores ou subcomponentes. Utilizado para iniciar o o a uma página web sem ter que ar pelo Front Controller. Utilizado para centralizar e controlar o tratamento de requisições HTTP.
CAMADA DE NEGÓCIO
Business Delegate Service Locator Session Façade Application Service Business Object Composite Entity
Utilizado para encapsular o o a componentes e serviços de negócio, ocultando os detalhes de implementação. Utilizado para encapsular a pesquisa de componentes e serviços de negócio de maneira uniforme. Utilizado para encapsular o o a componentes e serviços de negócio, expondo remotamente suas interfaces. Utilizado para centralizar a lógica que envolve vários componentes e serviços da camada de negócio, de forma que forneça uma camada de serviço mais uniforme. Utilizado para separar dados e lógica de negócio de um objeto (Ex: em um cenário em que um objeto possui informações de um cliente, tais como endereço). Utilizado para agregar um conjunto de entidades em um objeto conceitual de negócio. Utilizado para transferir dados entre as camadas de negócio, apresentação e integração. Utilizado para criar e centralizar um modelo de aplicação composto por Transfer Object. Utilizado para gerenciar o processamento e armazenamento em cache de consultas que retornam uma grande quantidade de informações. 16712855225
Transfer Object Transfer Object Assembler Value List Handler
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 65 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02 CAMADA DA INTEGRAÇÃO
Data Access Object Service Activator Domain Store: Web Service Broke
Utilizado para encapsular e gerenciar todo o a fontes de dados e suas persistências. Utilizado para trocar mensagens JMS, chamando processos assíncronos. Utilizado para separar o código de persistência do modelo de objetos. Utilizado para ar serviços através de XML e protocolos HTTP.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 66 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - 2012 – TJ/RO – Analista de Sistemas) O padrão de projeto JEE que encapsula a complexidade das interações entre os objetos de negócios participantes de um fluxo de trabalho, ou seja, que esconde do cliente a complexidade de interação entre os participantes, encapsulando a lógica de negócios associada aos requisitos, é denominado: a) service activator. b) session facade. c) Ajax. d) intercepting filter. e) front controller. Comentários: Trata-se do Session Façade! Ele esconde sua complexidade interna e apresenta apenas sua fachada externa, i.e., sua interface. Gabarito: B (CESPE – CENSIPAM – Analista de Sistemas) Entre os objetivos do padrão Business Delegate na plataforma J2EE, incluem-se: reduzir o acoplamento entre clientes na camada de apresentação e os serviços providos pela camada de negócio; reduzir o tráfego entre os clientes na camada de apresentação e a camada de negócio; reduzir o impacto de mudanças na camada de negócios sobre a camada de apresentação. 16712855225
Comentários: Perfeito, é exatamente isso! Ele é utilizado para encapsular o o a componentes e serviços de negócio, ocultando os detalhes de implementação. Gabarito: C
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 67 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE – CENSIPAM – Analista de Sistemas) Entre os objetivos do padrão DAO na plataforma J2EE, incluem-se: abstrair e encapsular os os às fontes dos dados; gerenciar as conexões com as fontes dos dados; implementar o mecanismo de o necessário para se usar uma fonte de dados; isolar detalhes de implementação relacionados ao o às fontes dos dados visando facilitar a migração entre diferentes fontes de dados. Comentários: Perfeito, é exatamente isso! Ele é utilizado para encapsular e gerenciar todo o a fontes de dados e suas persistências. Gabarito: C (CESPE - 2012 – TJ/RO – Analista de Sistemas) O padrão de projeto JEE (J2EE patterns) que é utilizado para solucionar problemas de o e manipulação de dados em uma camada separada e que implementa mecanismos de o para persistência de dados, em arquitetura mainframes, LDAP ou sistemas gerenciadores de banco de dados relacionais é denominado: a) transfer object. b) value list handler. c) transfer object assembler. d) JDBC. e) data access object. Comentários: Trata-se do DAO (Data Access Object).
16712855225
Gabarito: E (CESPE 3 – MPE/MA – Analista de Sistemas) Em uma aplicação web desenvolvida com Java utilizando o padrão MVC, as servlets e as classes no padrão DAO são representadas, respectivamente, nos componentes: a) Controller e View. b) View e Model. c) Controller e Model. d) Model e Controller. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 68 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
e) View e Controller. Comentários: MVC é um estilo arquitetural e um padrão de projeto. Ele divide uma aplicação em componentes: - Modelo: responsável por modelar os dados da aplicação e as regras de negócio. Tem o foco voltado para o armazenamento, manipulação e geração de dados. Seus objetos geralmente são reusáveis, distribuídos, persistentes e portáveis. - Visão: responsável pela apresentação dos dados aos usuários. Ele recebe entradas de dados e apresenta resultados. Essa camada não persiste nenhum dado no sistema e também não busca dados, apenas os renderiza em tela. - Controle: responsável por definir o comportamento da aplicação. Processa e responde a eventos, geralmente ações do usuário, e pode invocar alterações no modelo. Realiza, também, a validação de dados do usuário. Servlets são processadores de requisições, logo eles ficam na camada de controle. Os DAOs são objetos que am e gerenciam a persistência, logo eles ficam na camada de Modelo. Gabarito: C (FCC - 06 – BACEN – Analista de Sistemas) Considerando que os padrões de projeto J2EE possuem os padrões de apresentação e estes levam em consideração a lógica requerida para que o cliente e um sistema J2EE, analise: 16712855225
I. Comb Filter é um padrão de apresentação que combina consolidação de dados. II. Intercepting Filter facilita o pré-processamento e o pós-processamento de uma requisição. III. Front Controller provê um controle centralizado para o gerenciamento do tratamento das requisições. IV. Single View cria uma única pesquisa para o a dados combinados. É correto o que consta APENAS em:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 69 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
a) I e III. b) I e IV. c) II e III. d) II, III e IV. e) IV. Comentários: Comb Filter não é um Padrão de Projeto Java EE! Além disso, não existe Single View – a descrição é do Composite View. Gabarito: C (FCC – 2015 – TRT/MG – Analista de Sistemas) O Java EE pode ser organizado em três conjuntos de padrões de projeto, de acordo com as camadas da arquitetura JEE: Padrões da Camada de Apresentação (Web Tier Patterns), Padrões da Camada de Negócio (Business Tier Patterns) e Padrões da Camada de Integração (EIS Tier Patterns). São padrões de projeto da Camada de Apresentação: a) Intercepting Filter e Front Controller. b) Session Façade e Composite Entity. c) Service Activator e Web Service Broke. d) Data Access Object e View Helper. e) Application Service e Transfer Object. Comentários: 16712855225
CAMADA DE APRESENTAÇÃO
CAMADA DE NEGÓCIO
CAMADA DE INTEGRAÇÃO
INTERCEPTING FILTER
BUSINESS DELEGATE
DATA ACCESS OBJECT
FRONT CONTROLLER
SERVICE LOCATOR
SERVICE ACTIVATOR
CONTEXT OBJECT
SESSION FAÇADE
DOMAIN STORE
APPLICATION CONTROLLER
APPLICATION SERVICE
WEB SERVICE BROKER
VIEW HELPER
BUSINESS OBJECT
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 70 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
COMPOSITE VIEW
COMPOSITE ENTITY
SERVICE TO WORKER
TRANSFER OBJECT
DISPATCHER VIEW
VALUE LIST HANDLER TRANSFER OBJECT ASSEMBLER
Conforme vimos em aula, trata-se do Intercepting Filter e Front Controller. Gabarito: A ACERTEI
ERREI
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 71 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
PADRÕES DE PROJETO (GRASP) O GRASP, acrônimo de General Responsability Assignment Software Patterns (ou Principles), consiste em um conjunto de práticas que descrevem os princípios fundamentais de atribuição de responsabilidade a objetos, expressas na forma de padrões. Ele ajuda a compreender melhor a utilização da orientação a objetos em projetos complexos. A qualidade de um projeto orientado a objetos está fortemente relacionada à distribuição de responsabilidades, que podem ser divididas em Responsabilidade de Conhecimento (Knowing) e Responsabilidade de Realização (Doing). A primeira refere-se à distribuição das características do sistema entre as classes e a segunda à distribuição do comportamento do sistema entre as classes. As Responsabilidades do Tipo Realização são realizadas por um único método ou uma coleção de métodos trabalhando em conjunto. Já as Responsabilidades do Tipo Conhecimento são inferidas a partir do modelo conceitual, i.e., são atributos e relacionamentos. Lembram-se da UML? Pois é, os Diagramas de Interação são bastante utilizados para representar responsabilidades. Galera, para ser bem sincero com vocês, eu considero Padrões GRASP mais como uma filosofia de projeto do que como um conjunto de padrão de projeto. Eles descrevem princípios fundamentais de desenho orientado a objetos e definição de responsabilidades, expressos em padrões. Vocês sabem o que significa o verbo To Grasp? Significa tomar, agarrar, apreender, captar, aferrar, pegar de súbito. Esse nome foi escolhido com o intuito de sugerir a importância de agarrar ou captar esses princípios para desenhar projetos de software orientados a objetos da melhor forma possível. Os Padrões de Projeto GOF exploram soluções de projeto mais específicas, já os Padrões de Projeto GRASP refletem práticas mais pontuais da aplicação de técnicas orientadas a objetos. 16712855225
O Padrão GRASP é composto de cinco Padrões Básicos e quatro Padrões Avançados. Os Padrões Básicos são: Information Expert, Creator, High Cohesion, Low Coupling e Controller. Já os Padrões Avançados são: Polymorphism, Pure Fabrication, Indirection e Protected Variations. Assim como os Padrões de Projeto (GOF), para resolver a grande maioria das questões, basta conhecer a descrição básica.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 72 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Expert: Também conhecido como Information Expert, esse padrão é utilizado para determinar para quem delegar as responsabilidades. Essas responsabilidades incluem métodos, campos calculados, etc. Deve-se atribuir a responsabilidade ao especialista da informação, isto é., a classe que possui a informação necessária para satisfazer essa responsabilidade. Creator: A criação de objetos é uma das atividades mais comuns em sistemas orientados a objetos. Esse padrão é responsável por criar objetos de classes, sendo uma propriedade fundamental do relacionamento entre objetos em determinadas classes, i.e., possui a responsabilidade unívoca pela criação de uma nova instância de uma classe. High Cohesion:
16712855225
Esse padrão busca manter objetos apropriadamente focados, gerenciáveis e compreensíveis. Geralmente é utilizado para ar o baixo acoplamento, enfatizando que as responsabilidades de um dado elemento são fortemente relacionadas e altamente focadas. Eu sempre decorei assim: “Coesão é a divisão de responsabilidades”. Low Coupling: Esse padrão é responsável por ditar como atribuir responsabilidades para apoiar baixa dependência entre classes, como ar mudanças em uma classe que Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 73 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
tenham baixo impacto em outras classes, e maior potencial de reúso. acoplamento está sempre associado à coesão. Eu sempre decorei assim: “Acoplamento é a dependência entre as partes”. Controller: Esse padrão tem o objetivo de atribuir a responsabilidade de lidar com eventos de sistema a uma classe que não implemente elementos gráficos, e represente um sistema completo ou um cenário de caso de uso. Um objeto Controller não é uma interface com o usuário, trata-se – na verdade um objeto responsável por receber e tratar eventos do sistema. Polymorphism: Esse padrão atribui a responsabilidade de definir a variação de comportamentos baseado em tipos aos tipos em que essas variações ocorrem. Isso ocorre por meio de operações polimórficas. Em outras palavras, não se deve utilizar a lógica condicional para decidir qual comportamento será realizado, mas utilizar os próprios tipos. Galera, é o polimorfismo comum à orientação a objetos. Pure Fabrication: Esse padrão apresenta uma classe que não representa um conceito real, mas artificial, no domínio de problema, sendo utilizada para atingir baixo acoplamento, alta coesão e o potencial reúso. Em outras palavras, ela atribui um conjunto altamente coesivo de responsabilidade a uma classe artificial que não representa um conceito do domínio do problema. Indirection:
16712855225
Esse padrão atribui responsabilidade a um objeto intermediário para mediar as mensagens entre outros componentes ou serviços para que não sejam diretamente acoplados. Ele cria uma camada de indireção entre os dois componentes que não mais dependem um do outro, i.e., ambos dependem da indireção. Um exemplo é o Componente Controller no MVC - ele faz a mediação entre Model e View. Protected Variations: Esse padrão identifica pontos de variação ou instabilidades potenciais e atribui responsabilidades para criar uma interface estável em volta desses pontos. Dessa Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 74 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
forma, ela protege elementos das variações de outros elementos (objetos, sistemas, subsistemas) ao envolver o foco de instabilidade em uma interface e usando o polimorfismo para criar várias implementações desta interface.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 75 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - 2013 – TCE/RO – Analista de Informática O padrão Pure Fabrication objetiva designar a responsabilidade unívoca pela criação de uma nova instância de uma classe. Comentários: Creator: A criação de objetos é uma das atividades mais comuns em sistemas orientados a objetos. Esse padrão é responsável por criar objetos de classes, sendo uma propriedade fundamental do relacionamento entre objetos em determinadas classes, i.e., possui a responsabilidade unívoca pela criação de uma nova instância de uma classe. Conforme vimos em aula, a questão trata do Padrão Creator! Gabarito: E (CESPE - 2013 – TCE/RO – Analista de Informática) Nos casos em que a solução oferecida pelo padrão Expert violar a alta coesão e o baixo acoplamento, o padrão adequado a ser aplicado será o Creator, que atribui um conjunto altamente coesivo de responsabilidades a uma classe artificial que não representa um conceito do domínio do problema. 16712855225
Comentários: Pure Fabrication: Esse padrão apresenta uma classe que não representa um conceito real, mas artificial, no domínio de problema, sendo utilizada para atingir baixo acoplamento, alta coesão e o potencial reúso. Em outras palavras, ela atribui um conjunto altamente coesivo de responsabilidade a uma classe artificial que não representa um conceito do domínio do problema.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 76 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Conforme vimos em aula, a questão trata do Padrão Padrão Pure Fabrication! Gabarito: E (CESPE - 2013 – TCE/RO – Analista de Informática) O padrão Indirection é utilizado para atribuir responsabilidades à classe que tiver a informação necessária para satisfazer a responsabilidade. Comentários: Expert: Também conhecido como Information Expert, esse padrão é utilizado para determinar para quem delegar as responsabilidades. Essas responsabilidades incluem métodos, campos calculados, etc. Deve-se atribuir a responsabilidade ao especialista da informação, isto é., a classe que possui a informação necessária para satisfazer essa responsabilidade. Conforme vimos em aula, a questão trata do Padrão Expert! Gabarito: E (CESPE - 2013 – TCE/RO – Analista de Informática) O padrão Don’t Talk to Strangers é utilizado para fortalecer o polimorfismo, realizado pelo padrão Polymorphism. O objetivo de ambos os padrões é substituir um componente sem afetar outro componente, embora o primeiro implemente o polimorfismo em nível de classe e o segundo lide com alternativas embasadas no tipo de componente. 16712855225
Comentários: Protected Variations: Esse padrão identifica pontos de variação ou instabilidades potenciais e atribui responsabilidades para criar uma interface estável em volta desses pontos. Dessa forma, ela protege elementos das variações de outros elementos (objetos, sistemas, subsistemas) ao envolver o foco de instabilidade em uma interface e usando o polimorfismo para criar várias implementações desta interface.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 77 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Polymorphi Esse padrão atribui a responsabilidade de definir a variação de comportamentos baseado em tipos aos tipos em que essas variações ocorrem. Isso ocorre por meio de operações polimórficas. Em outras palavras, não se deve utilizar a lógica condicional para decidir qual comportamento será realizado, mas utilizar os próprios tipos. Galera, é o polimorfismo comum à orientação a objetos. Galera, além de ser o nome de uma música do grande Ronnie James Dio, Don’t Talk to Strangers é o nome da versão original do Padrão Protected Variations. No entanto, quem lida com alternativas embasadas no tipo de componente é o Padrão Polymorphism. Quem liga com o polimorfismo em nível de classe é o Padrão Don’t Talk to Strangers (ou Protected Variations). Gabarito: E (CESPE - 2013 - CNJ - Analista Judiciário - Análise de Sistemas) Os padrões: Controller; Polimorfismo; e Information Expert, são considerados do tipo GRASP porque cada um embute uma forma de atribuição de responsabilidades a objetos. No caso do Controller, a responsabilidade é concernente ao tratamento de eventos. No caso do Polimorfismo, a responsabilidade é concernente à variação de comportamento, conforme o tipo do objeto. No caso do Information Expert, a responsabilidade concerne à disponibilidade de informações que permitem o desempenho de uma responsabilidade. Comentários: Questão mais perfeita, impossível! Tudo correto! 16712855225
Gabarito: C
(CESPE - 2010 - MPU – Desenvolvimento de Sistemas) GRASP (general responsibility assignment software patterns) consiste em um conjunto de sete padrões básicos para atribuir responsabilidades em projeto orientado a objetos: information expert, creator, controller, low coupling, high cohesion, polymorphism e pure fabrication. Comentários: O Padrão GRASP é composto de cinco Padrões Básicos e quatro Padrões Avançados. Os Padrões Básicos são: Information Expert, Creator, High Cohesion, Low Coupling e Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 78 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Controller. Já os Padrões Avançados são: Polymorphism, Pure Fabrication, Indirection e Protected Variations. Assim como os Padrões de Projeto (GOF), para resolver a grande maioria das questões, basta conhecer a descrição básica.
Conforme vimos em aula, temos cinco padrões básicos! Gabarito: E (CESPE – SERPRO – Desenvolvimento de Sistemas) No polimorfismo, que é um tipo de padrão GRASP, um mesmo método pode apresentar várias formas. Comentários: Polymorphism: Esse padrão atribui a responsabilidade de definir a variação de comportamentos baseado em tipos aos tipos em que essas variações ocorrem. Isso ocorre por meio de operações polimórficas. Em outras palavras, não se deve utilizar a lógica condicional para decidir qual comportamento será realizado, mas utilizar os próprios tipos. Galera, é o polimorfismo comum à orientação a objetos. 16712855225
Conforme vimos em aula, está perfeito! Gabarito: C (CESPE - SERPRO - Analista - Desenvolvimento de Sistemas) Expert é um padrão que apresenta uma interface para várias funcionalidades de uma API de maneira simples e fácil de usar. Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 79 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Bem, essa descrição se aproxima mais do Padrão Protected Variations ou, no caso dos Padrões de Projeto GOF, se aproxima mais do Padrão Façade! Gabarito: E (CESPE - 2010 - SERPRO - Analista de Sistemas) Os padrões GRASP (general responsibility assignment software patterns) consistem em modelos de distribuição de responsabilidades a classes e objetos em implementações orientadas a objetos. Os principais exemplos de padrões GRASP são: Information Expert, Creator, Visitor, Controller, Iterator, Low Coupling, High Cohesion, Polymorphism, State, Strategy, Pure Fabrication, Indirection, Proxy e Protected Variations. Comentários:
Conforme vimos em aula, não existe Padrão GRASP Visitor, Iterator, State, Strategy e Proxy – todos esses são Padrões GOF! 16712855225
Gabarito: E 10. (CESPE - 2014 – SUFRAMA - Analista de Sistemas) Enquanto os padrões GRASP refletem práticas mais pontuais da aplicação de técnicas orientadas a objetos, os padrões de projeto GoF (Gang of Four) exploram soluções mais específicas. Dessa forma, não há, no GRASP, um padrão que ajude a solucionar, por exemplo, a definição de qual classe deve ser a responsável por lidar com um evento de determinada interface. Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 80 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Esse nome foi escolhido com o intuito de sugerir a importância de agarrar ou captar esses princípios para desenhar projetos de software orientados a objetos da melhor forma possível. Os Padrões de Projeto GOF exploram soluções de projeto mais específicas, já os Padrões de Projeto GRASP refletem práticas mais pontuais da aplicação de técnicas orientadas a objetos. Controller: Esse padrão tem o objetivo de atribuir a responsabilidade de lidar com eventos de sistema a uma classe que não implemente elementos gráficos, e represente um sistema completo ou um cenário de caso de uso. Um objeto Controller não é uma interface com o usuário, mas é um objeto responsável por receber e tratar eventos do sistema. Claro que há! Conforme vimos em aula, trata-se do Padrão Controller. Gabarito: E 11. (CESPE - 2014 – SUFRAMA - Analista de Sistemas) Em um cenário em que é necessário minimizar dependências e maximizar o reúso, bem como atribuir uma responsabilidade para que o acoplamento mantenha-se fraco, o padrão Expert é mais adequado que o padrão Low Coupling. Comentários: Low Coupling: Esse padrão é responsável por ditar como atribuir responsabilidades para apoiar baixa dependência entre classes, como ar mudanças em uma classe que tenham baixo impacto em outras classes, e maior potencial de reúso. O acoplamento está sempre associado à coesão. Eu sempre decorei assim: “Acoplamento é a dependência entre as partes”. 16712855225
Conforme vimos em aula, o Padrão Low Coupling é o mais adequado! Gabarito: E ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 81 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
LISTA DE EXERCÍCIOS COMENTADOS (CESPE) PADRÕES DE PROJETO GOF (CESPE - 2013 - INPI - Analista de Planejamento - Desenvolvimento Manutenção de Sistemas) O padrão bridge, além de converter a interface de uma classe existente em outra interface esperada pelos clientes, permite que algumas classes com interfaces diferentes funcionem conjuntamente. (CESPE - 2013 - INPI - Analista de Planejamento - Desenvolvimento e Manutenção de Sistemas) Design patterns não se aplicam, exclusivamente, ao Java, podendo ser empregados em projetos que utilizam linguagem C#. (CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6) O padrão de projeto conhecido como façade é indicado para a definição de uma interface de nível mais alto que torne mais fácil a comunicação entre os subsistemas de um sistema complexo. (CESPE - 2010 - TRT - 21ª Região (RN) - Técnico Judiciário - Tecnologia da Informação) Os padrões de projeto podem ser definidos como soluções já testadas para problemas que ocorrem frequentemente durante o projeto de software. (CESPE - 2008 - STJ - Analista Judiciário - Tecnologia da Informação) Os padrões de projeto podem ser usados no projeto orientado a objetos para apoiar o reúso de software. Esses padrões frequentemente empregam a herança e o polimorfismo para prover generalidade. Abstract factory, strategy e template method são padrões de projeto que podem ser empregados nos frameworks orientados a objetos para facilitar a adaptação dos frameworks. 16712855225
(CESPE - 2008 - -DF - Analista Judiciário - Tecnologia da Informação) O padrão de projeto orientado a objetos denominado singleton exprime o fenômeno recorrente na análise que é a existência de muitas aplicações nas quais há um objeto que é a única instância de sua classe. (CESPE - ANAC - Técnico istrativo - Informática) O uso de padrões de projeto somente pode ser aplicado a projetos que implementam o paradigma de programação orientada a objetos.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 82 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - 2008 - SERPRO - Analista - Desenvolvimento de Sistemas) Adapter é um padrão estrutural utilizado para compatibilizar interfaces de modo que elas possam interagir. (CESPE - 2008 - SERPRO - Analista - Desenvolvimento de Sistemas) O Singleton é um padrão que garante que uma classe tenha apenas uma instância. - SERPRO - Analista - Desenvolvimento de Sistemas) Alguns 10. (CESPE padrões de criação como o Prototype, o Proxy e o Façade não são adequados para a programação orientada a objetos. 11. (CESPE - TCU - Analista de Controle Externo - Tecnologia da Informação - Prova 2) Caso seja verificado no desenvolvimento de um sistema forte acoplamento entre as classes, recomenda-se o uso do padrão de comportamento Factory Method, que evita o acoplamento do remetente de uma solicitação ao seu receptor, dando a mais de um objeto a oportunidade de tratar uma solicitação, mesmo nos casos em que o conjunto de objetos não seja conhecido a priori ou seja definido dinamicamente. 12. (CESPE - TCU - Analista de Controle Externo - Tecnologia da Informação - Prova 2) No desenvolvimento de um sistema estruturado em subsistemas para facilitar o o e minimizar a comunicação e dependências entre os subsistemas, o padrão de criação Factory Method, que fornece uma interface para a criação de famílias de objetos relacionados ou dependentes sem especificar suas classes concretas, é mais indicado que o padrão de criação Prototype. 13. (CESPE - TCU - Analista de Controle Externo - Tecnologia da Informação - Prova 2) Se, no desenvolvimento de uma aplicação que leia documentos do tipo txt e seja capaz de converter o documento em vários formatos distintos, houver a necessidade de facilitar acréscimos de novos tipos de conversão, será mais indicado o uso do padrão de estrutura Adapter que o uso do padrão de estrutura Bridge, pois o padrão Adapter separa a construção de um objeto complexo de sua representação para criar representações diferentes com o mesmo processo. 16712855225
14. (CESPE - 2013 - ANT - Desenvolvimento de Sistemas) Em programação orientada a objetos, o padrão de projeto denominado Iterator define uma forma de o sequencial aos elementos de um objeto agregado, sem expor sua representação interna. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 83 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
15. (CESPE - 2013 - ANTT - Desenvolvimento de Sistemas) Em programação orientada a objetos, o padrão de projeto denominado Singleton define uma classe que possui apenas uma instância e provê um ponto de o local a ela. 16. (CESPE - 2013 – TCO/RO - Analista de Informática – Desenvolvimento de Sistemas) Uma das aplicabilidades do padrão Iterator é a representação de hierarquias do tipo todo-parte de objetos, de modo que a aplicação seja capaz de ignorar a diferença entre composições de objetos e objetos individuais, haja vista que todos os objetos tratados no padrão têm comportamento uniforme. 17. (CESPE - 2013 – TCO/RO - Analista de Informática – Desenvolvimento de Sistemas) O padrão Adapter será mais apropriado que o Façade quando for necessário fornecer uma interface unificada para um conjunto de interfaces em um subsistema. 18. (CESPE - 2013 – TCO/RO - Analista de Informática – Desenvolvimento de Sistemas) O uso do padrão Builder tem a vantagem de permitir o controlado à instância de uma classe, uma vez que ele encapsula a classe, criando um ponto global único de o. 19. (CESPE - 2013 – TCO/RO - Analista de Informática – Desenvolvimento de Sistemas) Os padrões estruturais, tais como o Bridge e o Proxy, abstraem o processo de instanciação, ajudando a tornar um sistema independente de como os seus objetos são criados. Já os padrões de criação, como Prototype e o Builder, se preocupam com a forma como as classes e os objetos são criados para formar estruturas compostas maiores. (CESPE - 2012 - BASA - Tecnologia da Informação – Técnico Científico) O padrão mediator define um objeto que encapsula como um conjunto de objetos interage. Esse padrão torna desnecessário que cada objeto armazene referências para todos os objetos com os quais interage e pode ser usado quando objetos se comunicam de forma definida, mas complexa. 16712855225
21. (CESPE - 2012 - BASA - Tecnologia da Informação – Técnico Científico) O padrão adapter define uma família de algoritmos, permite o encapsulamento de algoritmos e possibilita a substituição desses algoritmos. Os algoritmos podem variar independentemente dos seus clientes. Esse padrão pode ser usado quando várias classes relacionadas diferirem apenas nos seus comportamentos.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 84 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - TCE-RN – Assessor Técnico de Informática) O template method se aplica primariamente às classes, sendo um padrão de projeto com finalidade comportamental, ou seja, caracterizado pela maneira como as classes interagem e distribuem responsabilidades. (CESPE - 2010 – TRT/RN – Técnico Judiciário – Tecnologia da Informação) Os padrões de projeto podem ser definidos como soluções já testadas para problemas que ocorrem frequentemente durante o projeto de software. 24. (CESPE - 2007 - TST - Analista Judiciário – Análise de Sistemas) Um dos mecanismos da orientação a objetos para reutilização de software é a identificação e documentação de padrões de projeto (design patterns), que são modelos particulares de classes e de objetos comunicantes que se repetem de um projeto para outro e que podem assim ser padronizados. (CESPE - 2006 – DATAPREV - Analista de Sistemas) As seguintes situações justificam o uso do padrão Abstract Factory: o sistema deve ser independente de como os objetos são criados; o sistema deve poder ser configurado com diferentes famílias de classes; é necessário garantir que certas classes sejam usadas em conjunto. (CESPE - 2006 – DATAPREV - Analista de Sistemas) As seguintes situações justificam o uso do padrão Adapter: é necessário um objeto local que se faça ar por um objeto localizado em outro espaço de endereçamento; é necessário controlar o o a um objeto; um objeto persistente deve ser carregado em memória somente quando for referenciado. 27. (CESPE - 2006 – DATAPREV - Analista de Sistemas) As seguintes situações justificam o uso do padrão Command: um conjunto de objetos se comunica de forma definida porém complexa, o que resulta em interdependências difíceis de serem entendidas; o reúso está sendo dificultado pois cada objeto se comunica com vários outros objetos. 16712855225
(CESPE - 2006 – DATAPREV - Analista de Sistemas) As seguintes situações justificam o uso do padrão Strategy: é necessário configurar uma classe com uma variedade de comportamentos; uma classe usa diferentes variações de um algoritmo; o método de uma classe tem muitos enunciados condicionais pois a classe tem comportamentos variados.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 85 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE – DATAPREV - Analista de Sistemas) Quanto aos padrões de projeto orientados a objetos, assinale a opção correta. a) O Facade pode ser usado quando se deseja prover uma interface simples para um subsistema complexo; existem muitas dependências entre clientes e as classes que implementam uma abstração. b) Pode-se usar o Decorator quando um sistema deve ser configurado com uma entre várias famílias de produtos; uma família de produtos relacionados foi projetada para ser usada em conjunto. c) O Adapter pode ser usado quando objetos se comunicam de forma definida, mas complexa; as interdependências entre os objetos são difíceis de entender; o reúso está sendo dificultado, pois um objeto se comunica com vários outros. d) Pode-se usar o Builder quando o comportamento de um objeto muda em tempo de execução e depende do seu estado; as operações têm múltiplos enunciados condicionais que dependem do estado do objeto. (CESPE 1– - Analista de Sistemas) O padrão Singleton garante que uma classe tenha somente uma instância, fornecendo, assim, um ponto global de o a essa instância. 31. (CESPE - 2011 – MEC - Analista de Sistemas) O padrão Prototype pode ser usado no desenvolvimento de programas escritos com a linguagem PHP 5.0, atuando como padrão estrutural que permite construir tanto classes quanto objetos. (CESPE - 2011 – MEC - Analista de Sistemas) Os padrões de projeto são úteis tanto na fase de planejamento da arquitetura quanto na de desenvolvimento e codificação. 16712855225
(CESPE - 2011 – MEC - Analista de Sistemas) O padrão Abstract Factory é corretamente aplicável, quando necessário, para fornecer uma biblioteca de classes e não revelar suas interfaces. 34. (CESPE - 2013 – MPOG - Analista de Sistemas) O padrão de comportamento e encadeamento de atendentes (chain of responsibility) evita acoplamento entre solicitantes e atendentes, permitindo que mais de um objeto tenha chance de tratar a solicitação.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 86 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE - 2013 – MPOG - Analista de Sistemas) Para um problema recorrente no desenvolvimento de sistemas, normalmente, um padrão de projeto descreve uma solução geral, que não pode ser reutilizada. (CESPE - 2013 – MPOG - Analista de Sistemas) Padrões de projeto envolvem combinações de classes e algoritmos associados que cumprem com propósitos comuns de projeto. 37. (CESPE – 2008 – STF - Analista de Sistemas) A figura acima, adaptada de java.sun.com, ilustra a arquitetura de uma aplicação web desenvolvida na plataforma J2EE, tendo sido alguns de seus módulos nomeados de A até I. Considere que uma aplicação com a arquitetura mostrada tenha sido instalada em um servidor de aplicação JBoss 4.0 ou superior, por meio do deploy de um arquivo com nome aplicação.war, e se encontrem pleno funcionamento. Conforme a nomenclatura proposta pelo GoF (Gang of Four) book, o nome dado ao módulo F sugere que esse módulo implementa um padrão da categoria comportamental, enquanto o nome do módulo C sugere que ele implementa um padrão da categoria estrutural. (CESPE - 2015 – TCU - Analista de Sistemas) Nos padrões de projeto (design patterns) estruturais, utilizam-se técnicas que valorizam um forte acoplamento entre as classes para favorecer o aprendizado e a portabilidade das aplicações.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 87 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
LISTA DE EXERCÍCIOS COMENTADOS (FCC) PADRÕES DE PROJETO GOF (FCC - 2011 - TCE-PR - Analista de Controle – Informática - A) Os design patterns: a) são projetos de arquitetura para um domínio específico de aplicação e sempre trazem componentes predefinidos que envolvem código de programação. b) consistem em conjuntos de classes que um usuário instancia para utilizar seus métodos. Após a chamada ao método, o controle do fluxo da aplicação retorna para o usuário. c) são de uso exclusivo em processos de desenvolvimento de soluções orientado a objetos, já que os objetos são a mais adequada abstração para o reúso. d) são aplicações propriamente ditas, normalmente construídas pela integração de diversos frameworks. e) podem ser modelados utilizando-se a linguagem UML que fornece um meio eficiente de modelar padrões de projeto representando-os como colaborações. (FCC - 2010 - TRF - 4ª REGIÃO - Analista Judiciário - Tecnologia da Informação) Sobre os design patterns, é correto afirmar: a) Padrões e linguagens de padrões são maneiras de implementar sistemas orientados a objetos por meio da captação da experiência de programadores. Os padrões, apesar de abstratos, sempre incluem algum código de programação. 16712855225
b) São aplicações, propriamente ditas, dedicadas aos domínios de aplicações específicos, tais como sistemas de telecomunicações ou financeiros. c) Não são complexos e necessita-se de um tempo mínimo para aprender a usálos. d) O princípio geral de englobamento de experiência em um padrão é aplicável apenas à abordagem de projeto de software orientado a objetos.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 88 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
e) O padrão é uma descrição de conhecimento e experiência acumulados, uma solução comprovada para um problema comum. (FCC - -PI - Analista Judiciário - Tecnologia da Informação) Os padrões de projeto, quando aplicados ao desenvolvimento de aplicações, fornecem meios de descrever soluções comuns para problemas comuns, resultando em redução de tempo gasto com o desenvolvimento e melhoria da qualidade da aplicação. Analise: I. É o responsável pela especificação dos tipos de objetos a serem criados usando uma "instância" prototípica e pela criação de novos objetos copiando este protótipo. II. Define uma interface de nível mais alto que torna o subsistema mais fácil de usar e fornece uma interface única para um subsistema com diversas interfaces; compõe o grupo de padrões estruturais. III. Integrante do grupo de padrões comportamentais, ele provê uma forma de ar sequencialmente os elementos de um agregado de objetos, sem expor a representação interna desse agregado. IV. As consequências do uso deste padrão é que o encapsulamento é mantido, já que objetos usam sua própria informação para cumprir responsabilidades; leva ao fraco acoplamento entre objetos e à alta coesão, uma vez que objetos fazem tudo que é relacionado à sua própria informação. As afirmações correspondem, respectivamente, aos padrões a) Command, Iterator, Singleton e Expert. b) Controller, Expert, Singleton e Prototype. c) Command, Singleton, Controller e Façade. d) Prototype, Façade, Iterator e Expert. e) Adapter, Façade, Command e Iterator. 16712855225
(FCC - 2009 - -PI - Analista Judiciário - Tecnologia da Informação) Acerca desses padrões, avalie: I. Em termos de padrões de criação de projetos, algumas classes, tais como um spooler de impressão ou um sistema de arquivos, devem ser instanciadas uma única vez e prover um ponto de o global a esta instância. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 89 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
II. Pertencente ao grupo de padrões estruturais, é utilizado para permitir que dois objetos se comuniquem mesmo que tenham interfaces incompatíveis. III. Encapsula uma requisição como um objeto, permitindo que os clientes parametrizem diferentes requisições e filas, ou façam o registro de log de requisições e dêem e a operações que podem ser desfeitas. IV. Atribuir a responsabilidade do tratamento de um evento do sistema a uma classe que representa o próprio sistema ou à classe que representa um caso de uso. As proposições correspondem, respectivamente, aos padrões a) Singleton, Adapter, Command e Controller. b) Command, Iterator, Singleton e Expert. c) Façade, Iterator, Expert e Adapter. d) Controller, Expert, Singleton e Prototype. e) Adapter, Façade, Command e Iterator. (FCC - 2011 - TRT - 24ª REGIÃO (MS) - Analista Judiciário - Tecnologia da Informação) Considere: I. Fornecer uma interface para criação de famílias de objetos relacionados ou dependentes, sem especificar suas classes concretas. Possibilitar o adiamento da instanciação para as subclasses. II. Garantir a existência de apenas uma instância de uma classe, mantendo um ponto global de o ao seu objeto. 16712855225
III. Possibilitar o armazenamento do estado interno de um objeto em um determinado momento, para que seja possível retorná-lo a este estado, caso necessário. I, II e III são, respectivamente, objetivos dos Design Patterns intitulados: a) Interpreter, Iterator e Memento. b) Command, Singleton e Iterator. c) Factory Method, Singleton e Memento. d) Iterator, Factory Method e Flyweight. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 90 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
e) Singleton, Flyweight e Command. (FCC - 2011 - TRE-RN - Técnico Judiciário - Programação de Sistemas) Na engenharia de software, os padrões de projetos comportamentais tratam das interações e divisões de responsabilidades entre as classes ou objetos. São exemplos típicos dessa família: a) Command, Factory Method e Prototype. b) Builder, Prototype e Singleton. c) Chain of Responsability, Interpreter e Iterator. d) Adapter, Bridge e Façade. e) Abstract Factory, Builder e Composite. (FCC - 2011 - TRT - 4ª REGIÃO (RS) - Analista Judiciário - Tecnologia da Informação) O catálogo de padrões de projeto (Design Patterns) do GoF contém: a) 20 padrões e está basicamente dividido em duas seções: Structural e Behavioral. b) 21 padrões e está basicamente dividido em duas seções: Creational e Behavioral. c) 23 padrões e está basicamente dividido em duas seções: Structural e Behavioral. d) 23 padrões e está, basicamente, dividido em três seções: Creational, Structural e Behavioral. e) 24 padrões e está basicamente dividido em três seções: Creational, Spectral e Behavioral. (FCC - 2011 - TRT - 14ª Região (RO e AC) - Analista Judiciário - Tecnologia da Informação) No contexto dos padrões de projeto: 16712855225
I. Oferecer uma interface simples para uma coleção de classes. II. Desacoplar uma abstração de sua implementação para que ambas possam variar independentemente. Correspondem respectivamente a: a) Façade e Bridge. b) Adapter e Façade. c) Composite e Bridge. d) Façade e Composite. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 91 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
e) Bridge e Adapter. (FCC - Infraero - Analista de Sistemas As associações entre classes e objetos são tratadas pelos Padrões de Projeto de Software (Design Patterns) da família de Padrões: a) GoF Estruturais. b) GRASP Comportamentais. c) GRASP Estruturais. d) GoF de Criação. e) GoF Comportamentais. 10. (FCC - 2013 – DPE/SP - Analista de Sistemas) Um design pattern descreve uma solução geral comprovada e reutilizável para um problema recorrente no desenvolvimento de sistemas de software orientados a objetos. Padrões de projeto ajudam a reconhecer e implementar boas soluções para problemas comuns. Dois dos principais design patterns utilizados atualmente são descritos a seguir: I. Visa garantir que uma classe só tenha uma única instância e prover um ponto de o global a ela. II. Visa definir uma dependência um-para-muitos entre objetos para que quando um objeto mudar de estado os seus dependentes sejam notificados e atualizados automaticamente. Os design patterns descritos em I e II são, respectivamente: a) Singleton e Observer. b) Facade e Adapter. c) Composite e Adapter. d) Singleton e Command. e) Facade e Observer.
16712855225
11. (FCC - 2013 – TRT/15 - Analista de Sistemas) Os padrões Gang of Four (GoF) organizam um conjunto de padrões de projeto (design patterns) em três grupos: de criação, estruturais e comportamentais. Três destes padrões são descritos a seguir: I. Em situações em que classes precisam trabalhar juntas, mas isto não está sendo possível porque suas interfaces são incompatíveis, pode-se utilizar este design Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 92 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
pattern que permite converter a interface de uma classe em outra interface esperada pelos clientes de forma que classes com interfaces incompatíveis possam interagir. II. Este design pattern pode ser utilizado quando se deseja definir uma dependência um-para-muitos entre objetos de modo que quando um objeto muda o estado, todos seus dependentes são notificados e atualizados. III. Em situações em que se deseja ar o conteúdo de uma coleção sem expor sua representação interna utiliza-se este design pattern que permite prover uma interface única para varrer coleções diferentes. Os padrões descritos nos itens I, II e III são, respectivamente, a) Adapter, Facade e Strategy. b) Prototype, Composite e Command. c) Abstract Factory, Observer e Iterator. d) Adapter, Observer e Iterator. e) Abstract Factory, Composite e Command. 12. (FCC – 2013 – AL/RN– Analista de Sistemas Analise as seguintes afirmações: I. Fornece uma interface para a criação de uma família de objetos relacionados ou dependentes sem fornecer os detalhes de implementação das classes concretas. II. Converte uma interface de uma classe existente em outra interface esperada pelos clientes. Permite que algumas classes com interfaces diferentes trabalhem em conjunto. 16712855225
III. Separa uma implementação de sua abstração, de forma que ambas possam variar independentemente. IV. Separa a construção de um objeto complexo de sua representação, de modo que o mesmo processo possa criar representações diferentes. Tratam, respectivamente, dos design patterns: a) Builder − Adapter − Bridge − Abstract Factory. b) Abstract Factory − Adapter − Bridge − Builder. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 93 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
c) Bridge − Adapter − Builder − Abstract Factory. d) Adapter − Builder − Abstract Factory − Bridge. e) Builder − Bridge − Abs tract Factory − Adapter.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 94 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) PADRÕES DE PROJETO GOF (ESAF - 2005 – AFRFB - Analista de Sistemas) Analise as seguintes afirmações relacionadas a padrões de projetos: I. O padrão Builder separa a construção de um objeto complexo de sua representação, de modo a que o mesmo processo de construção possa criar diferentes representações. II. O método Abstract Factory fornece uma interface para a criação de uma família de objetos relacionados ou dependentes sem especificar suas classes completas. III. O padrão Bridge define uma interface para criar um objeto, mas deixa as subclasses decidirem que classe será instanciada. O Bridge permite a uma classe postergar a instanciação das subclasses. IV. O Chain of responsability usa compartilhamento para ar grandes quantidades de objetos e define uma dependência um-para-muitos entre objetos, de modo que quando um objeto muda de estado, todos os seus dependentes são automaticamente notificados e atualizados. Indique a opção que contenha todas as afirmações verdadeiras. a) I e III. b) II e III. c) III e IV. d) I e II. e) II e IV.
16712855225
(ESAF – 2008 – CGU - Analista de Sistemas) Ao longo das últimas décadas, a engenharia de software fez progressos significativos no campo de padrões de projeto – arquiteturas comprovadas para construir software orientado a objetos flexível e fácil de manter. Com relação ao padrão Facade, é correto afirmar que: a) Fornece um objeto representante ou um marcador de outro objeto para controlar o o ao mesmo.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 95 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
b) Define o esqueleto de um algoritmo em uma operação, postergando a definição de alguns os para subclasses. c) Define uma interface para criar um objeto, mas deixas as subclasses decidirem qual classe a ser instanciada. d) Fornece uma interface unificada para um conjunto de interfaces em um sistema. e) Define uma dependência “um para muitos” entre objetos, de modo que, quando um objeto muda de estado, todos os seus dependentes são automaticamente notificados e atualizados. (ESAF – – CGU - Analista de Sistemas Quanto à finalidade, os padrões de projeto podem ser classificados em padrões de criação, padrões de estutura ou padrões comportamentais. Correspondem à categoria de padrões estruturais: a) Facade, Prototype e Proxy. b) Adapter, Composite e Proxy. c) Adapter, Factory Method e Template Method. d) Builder, Template Method e Strategy. e) Adapter, Bridge e Singleton.
16712855225
(FGV – 2008 – AL - Analista de Sistemas Considera as seguintes assertivas sobre as vantagens do uso de padrões de software (software patterns):
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 96 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
I. Padrões de projeto proporcionam um vocabulário comum de projeto, facilitando comunicação, documentação e aprendizado dos sistemas de software. II. Padrões de projeto auxiliam no desenvolvimento de software por meio da reutilização do projeto de soluções computacionais já testadas e aprovadas. III. Uma biblioteca de padrões pode ajudar a melhorar e padronizar o desenvolvimento de software. As assertivas corretas são: a) somente II. b) somente I e II. c) somente I e III. d) somente II e III. e) I, II e III. (ESAF – 2012– CGU – Analista de Sistemas O padrão de projeto singleton é usado para restringir: a) a instanciação de uma classe para objetos simples. b) a instanciação de uma classe para apenas um objeto. c) a quantidade de classes. d) as relações entre classes e objetos. e) classes de atributos complexos. (FEMPERJ – 2012 – TCE/RJ – Analista de Sistemas Padrões de Projeto descrevem soluções para problemas recorrentes no desenvolvimento de sistemas de software orientados a objetos. Um padrão de projeto estabelece um nome e define o problema, a solução, quando aplicar esta solução e suas consequências. Um dos padrões de projeto mais utilizados é o padrão Adapter (adaptador), que tem como função: 16712855225
a) garantir a existência de apenas uma instância de uma classe, mantendo um ponto global de o ao seu objeto. b) adicionar dinamicamente um comportamento a um objeto existente sem alterar o código das classes existentes.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 97 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
c) fornecer uma interface para a criação de famílias de objetos correlatos ou dependentes sem a necessidade de especificar a classe concreta destes objetos. d) definir novas operações sem alterar as classes dos elementos sobre os quais ele opera. f) permitir que classes com interfaces incompatíveis possam interagir. (ESAF – 2012– ATRFB – Analista de Sistemas) Os padrões de projeto (Design Patterns) são classificados nas categorias: a) Situacional. Estrutural. Complementar. b) Criacional. Evolutiva. Contingencial. c) Compartimental. Vinculada. Comportamental. d) Criacional. Step-by-step. Orientada a requisitos. e) Criacional. Estrutural. Comportamental. (FGV – 2013 – AL/MA – Analista de Sistemas Com relação ao tema Padrões de Projeto, conforme descritos por Gamma et Alli, sobre o padrão Prototype, analise as afirmativas a seguir. I. Apresenta como benefícios adicionais a adição e a remoção de produtos em tempo de execução. II. Apresenta como benefícios adicionais a especificação de novos objetos pela variação de seus valores e/ou de sua estrutura. III. Apresenta como benefícios adicionais a redução da necessidade de criação de subclasses. Assinale:
16712855225
a) se somente a afirmativa I estiver correta. b) se somente a afirmativa II estiver correta. c) se somente a afirmativa III estiver correta. d) se somente as afirmativas I e II estiverem corretas. e) se todas as afirmativas estiverem corretas. (FGV – 2015 – AL/Caruaru – Analista de Sistemas) O catálogo denominado Padrões GoF (‘Gang of Four’) define soluções reutilizáveis para problemas frequentes em projetos de sistemas de software.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 98 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
Essas soluções estão organizadas em três famílias conforme o propósito de cada solução. Os padrões de projetos denominados Interpreter, Prototype e Flyweight que fazem parte desse catálogo, pertencem, respectivamente, às seguintes famílias: a) padrão comportamental, padrão de criação e padrão estrutural. b) padrão estrutural, padrão comportamental e padrão de criação. c) padrão comportamental, padrão estrutural e padrão de criação. d) padrão estrutural, padrão de criação e padrão comportamental. e) padrão de criação, padrão comportamental e padrão estrutural.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 99 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) PADRÕES DE PROJETO JAVA EE
(CESPE - 2012 – TJ/R – Analista de Sistemas) O padrão de projeto JEE que encapsula a complexidade das interações entre os objetos de negócios participantes de um fluxo de trabalho, ou seja, que esconde do cliente a complexidade de interação entre os participantes, encapsulando a lógica de negócios associada aos requisitos, é denominado: a) service activator. b) session facade. c) Ajax. d) intercepting filter. e) front controller.
16712855225
(CESPE – CENSIPAM – Analista de Sistemas) Entre os objetivos do padrão Business Delegate na plataforma J2EE, incluem-se: reduzir o acoplamento entre clientes na camada de apresentação e os serviços providos pela camada de negócio; reduzir o tráfego entre os clientes na camada de apresentação e a
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 100 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
camada de negócio; reduzir o impacto de mudanças na camada de negócios sobre a camada de apresentação. (CESPE – CENSIPAM – Analista de Sistemas) Entre os objetivos do padrão DAO na plataforma J2EE, incluem-se: abstrair e encapsular os os às fontes dos dados; gerenciar as conexões com as fontes dos dados; implementar o mecanismo de o necessário para se usar uma fonte de dados; isolar detalhes de implementação relacionados ao o às fontes dos dados visando facilitar a migração entre diferentes fontes de dados. (CESPE - 2012 – TJ/RO – Analista de Sistemas) O padrão de projeto JEE (J2EE patterns) que é utilizado para solucionar problemas de o e manipulação de dados em uma camada separada e que implementa mecanismos de o para persistência de dados, em arquitetura mainframes, LDAP ou sistemas gerenciadores de banco de dados relacionais é denominado: a) transfer object. b) value list handler. c) transfer object assembler. d) JDBC. e) data access object. (CESPE 3 – MPE/MA – Analista de Sistemas) Em uma aplicação web desenvolvida com Java utilizando o padrão MVC, as servlets e as classes no padrão DAO são representadas, respectivamente, nos componentes: a) Controller e View. b) View e Model. c) Controller e Model. d) Model e Controller. e) View e Controller.
16712855225
(FCC – BACEN – Analista de Sistemas) Considerando que os padrões de projeto J2EE possuem os padrões de apresentação e estes levam em consideração a lógica requerida para que o cliente e um sistema J2EE, analise: I. Comb Filter é um padrão de apresentação que combina consolidação de dados.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 101 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
II. Intercepting Filter facilita o pré-processamento e o pós-processamento de uma requisição. III. Front Controller provê um controle centralizado para o gerenciamento do tratamento das requisições. IV. Single View cria uma única pesquisa para o a dados combinados. É correto o que consta APENAS em: a) I e III. b) I e IV. c) II e III. d) II, III e IV. e) IV. (FCC – 2015 – TRT/MG – Analista de Sistemas) O Java EE pode ser organizado em três conjuntos de padrões de projeto, de acordo com as camadas da arquitetura JEE: Padrões da Camada de Apresentação (Web Tier Patterns), Padrões da Camada de Negócio (Business Tier Patterns) e Padrões da Camada de Integração (EIS Tier Patterns). São padrões de projeto da Camada de Apresentação: a) Intercepting Filter e Front Controller. b) Session Façade e Composite Entity. c) Service Activator e Web Service Broke. d) Data Access Object e View Helper. e) Application Service e Transfer Object.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 102 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
LISTA DE EXERCÍCIOS COMENTADOS (BANCAS DIVERSAS) PADRÕES DE PROJETO GRASP (CESPE - 2013 – TCE/RO – Analista de Informática) O padrão Pure Fabrication objetiva designar a responsabilidade unívoca pela criação de uma nova instância de uma classe. (CESPE - 2013 – TCE/RO – Analista de Informática) Nos casos em que a solução oferecida pelo padrão Expert violar a alta coesão e o baixo acoplamento, o padrão adequado a ser aplicado será o Creator, que atribui um conjunto altamente coesivo de responsabilidades a uma classe artificial que não representa um conceito do domínio do problema. (CESPE - 2013 – TCE/RO – Analista de Informática) O padrão Indirection é utilizado para atribuir responsabilidades à classe que tiver a informação necessária para satisfazer a responsabilidade. (CESPE - 2013 – TCE/RO – Analista de Informática) O padrão Don’t Talk to Strangers é utilizado para fortalecer o polimorfismo, realizado pelo padrão Polymorphism. O objetivo de ambos os padrões é substituir um componente sem afetar outro componente, embora o primeiro implemente o polimorfismo em nível de classe e o segundo lide com alternativas embasadas no tipo de componente. (CESPE - 2013 - CNJ - Analista Judiciário - Análise de Sistemas) Os padrões: Controller; Polimorfismo; e Information Expert, são considerados do tipo GRASP porque cada um embute uma forma de atribuição de responsabilidades a objetos. No caso do Controller, a responsabilidade é concernente ao tratamento de eventos. No caso do Polimorfismo, a responsabilidade é concernente à variação de comportamento, conforme o tipo do objeto. No caso do Information Expert, a responsabilidade concerne à disponibilidade de informações que permitem o desempenho de uma responsabilidade. 16712855225
(CESPE - 2010 - MPU – Desenvolvimento de Sistemas) GRASP (general responsibility assignment software patterns) consiste em um conjunto de sete padrões básicos para atribuir responsabilidades em projeto orientado a objetos: information expert, creator, controller, low coupling, high cohesion, polymorphism e pure fabrication.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 103 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
(CESPE – SERPRO – Desenvolvimento de Sistemas) No polimorfismo, que é um tipo de padrão GRASP, um mesmo método pode apresentar várias formas. (CESPE - SERPRO - Analista - Desenvolvimento de Sistemas) Expert é um padrão que apresenta uma interface para várias funcionalidades de uma API de maneira simples e fácil de usar. (CESPE - 2010 - SERPRO - Analista de Sistemas) Os padrões GRASP (general responsibility assignment software patterns) consistem em modelos de distribuição de responsabilidades a classes e objetos em implementações orientadas a objetos. Os principais exemplos de padrões GRASP são: Information Expert, Creator, Visitor, Controller, Iterator, Low Coupling, High Cohesion, Polymorphism, State, Strategy, Pure Fabrication, Indirection, Proxy e Protected Variations. 10. (CESPE - 2014 – SUFRAMA - Analista de Sistemas) Enquanto os padrões GRASP refletem práticas mais pontuais da aplicação de técnicas orientadas a objetos, os padrões de projeto GoF (Gang of Four) exploram soluções mais específicas. Dessa forma, não há, no GRASP, um padrão que ajude a solucionar, por exemplo, a definição de qual classe deve ser a responsável por lidar com um evento de determinada interface. 11. (CESPE - 2014 – SUFRAMA - Analista de Sistemas) Em um cenário em que é necessário minimizar dependências e maximizar o reúso, bem como atribuir uma responsabilidade para que o acoplamento mantenha-se fraco, o padrão Expert é mais adequado que o padrão Low Coupling. 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 104 de 106
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
GABARITO DOS EXERCÍCIOS COMENTADOS (CESPE) PADRÕES DE PROJETO GOF 1 E 11 E 21 E 31 E
2 C 12 E 22 C 32 C
3 C 13 E 23 C 33 C
4 C 14 C 24 C 34 C
5 C 15 E 25 C 35 E
6 C 16 E 26 E 36 C
7 E 17 E 27 E 37 C
8 C 18 E 28 C 38 E
9 C 19 E 29 A 39
10 E 20 C 30 C 40
9 A 19
10 A 20
GABARITO DOS EXERCÍCIOS COMENTADOS (FCC) PADRÕES DE PROJETO GOF 1 E 11 D
2 E 12 B
3 D 13
4 A 14
5 C 15
6 C 16
7 D 17
8 A 18
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) PADRÕES DE PROJETO GOF 16712855225
1 D
2 D
3 B
4 E
5 B
6 E
7 E
8 E
9 A
10
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) PADRÕES DE PROJETO JAVA EE 1 B
2 C
3 C
Prof. Diego Carvalho
4 E
5 C
6 C
7 A
www.estrategiaconcursos.com.br
8
9
Pág. 105 de 106
10
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 02
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS) PADRÕES DE PROJETO GRASP 1 E 11 E
2 E 12
3 E 13
4 E 14
5 C 15
6 E 16
7 C 17
8 E 18
9 E 19
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 106 de 106
10 E 20
Aula 03 Desenvolvimento de Software para Concursos - Curso Regular Professor: Diego Carvalho
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
AULA 03
SUMÁRIO
PÁGINA 01 02 12 33 48 135 161
Apresentação - Java: Conceitos Básicos - Java: Sintaxe - Java: Orientação a Objetos - Java: Conceitos Avançados Lista de Exercícios Comentados Gabarito
Lógica de Programação. Tipos de Dados. Operadores e Expressões. Estruturas de Controle, Seleção, Repetição e Desvio. Recursividade. Funções e Procedimentos. Complexidade de Algoritmos. Métodos de Ordenação. BubbleSort, InsertionSort, SelectionSort, QuickSort, ShellSort, MergeSort e HeapSort. Estruturas de Dados. Vetores e Matrizes. Lista Encadeada. Pilhas. Filas. Árvore. Grafos. Hashing. Estrutura de Arquivos. Padrões de Projeto GOF. Padrões de Projeto Java EE. Padrões de Projeto GRASP. Java SE. Conceitos Básicos. Plataforma Java. Compilação e Interpretação. agem por Valor e Referência. Empacotamento. Raiz. Identificadores. Blocos e Comandos. Comentários. Palavras Reservadas. Tipos Primitivos. Operadores. Vetores. Conversão de Tipos. Controle de Fluxos. Classes. Objetos. Atributos. Métodos. Herança. Encapsulamento. Interface. Polimorfismo. Interface Gráfica. Tipos Enumerados. Anotações. Classes Internas. Reflexão e Genéricos. Tratamento de Exceções. Sincronismo e Multithreading. Coleções. Streams e Serialização. Classes e Operações de I/O. Novidades Java 8. Arquitetura Java EE. JSP. Servlets. JSF. JPA. Hibernate. JDBC. JVM. Spring. Struts. JMS. JNDI. JTA. JSTL. HTML e CSS. JavaScript. JQuery. AJAX. DHTML. XHTML. XML. XSLT. XSD. Sistemas Móveis. Android. iOS. Segurança no Desenvolvimento. Compiladores e Interpretadores. Ferramentas de Controle de Versão. SVN. CVS. Git. Análise Estática de Código-Fonte. SonarQube. Integração Contínua (e outros) Framework .NET, C#, Visual Basic, ASP.NET e Visual Studio (Prof. Mayara Rosa) Delphi e PHP (Prof. Mayara Rosa). 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 1 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
JAVA: CONCEITOS BÁSICOS Vamos falar agora sobre uma das linguagens mais famosas do mundo! Professor, o que é Java? É uma linguagem de programação orientada a objetos, multiplataforma, robusta, portável, segura, extensível, concorrente e distribuída. E ela é totalmente orientada a objetos? Não! Por que não? Porque nem todos os seus tipos de dados são objetos (possui alguns tipos primitivos: int, float, long, double, char, etc). Só por causa disso, professor? Não, ela também não a Herança Múltipla! Entendi, mas existe alguma linguagem totalmente orientada a objetos? Sim, por exemplo: Smalltalk! E ela é uma linguagem compilada ou interpretada? Na verdade, ela é híbrida, i.e., ela é compilada e interpretada! Professor, ouvi dizer que Java é lento! É verdade? Atualmente, não! De fato, era lenta no início! No entanto, na década ada houve diversas melhorias na Java Virtual Machine (JVM) e em seu Compilador JIT1. Hoje em dia, o desempenho geral do Java é absurdamente rápido de acordo com diversos benchmarks. A Máquina Virtual é capaz de realizar diversas otimizações por meio de algoritmos heurísticos e o Compilador é capaz de identificar hotspots. Vocês sabiam que Java é uma Linguagem WORA? Pois é, esse acrônimo significa Write Once, Run Anywhere ou Escreva uma vez, execute em qualquer lugar. Trata-se de um slogan para exemplificar os benefícios multiplataforma da linguagem Java! Idealmente, isso significa que um programa em Java (uma vez compilado em um bytecode) pode rodar em qualquer equipamento que possua uma JVM! A linguagem Java foi criada pela Sun Microsystems, que depois foi adquirida pela Oracle, por quem é mantida atualmente. Por que ela é uma linguagem concisa e simples? Porque não contém redundâncias e é fácil de entender, implementar e utilizar. Ela possui sintaxe bastante parecida com C++, facilitando o aprendizado e a migração por novos programadores. 16712855225
Professor, Java é robusta? Sim! Além de ser fortemente tipada, foi desenvolvida para garantir a criação de programas altamente confiáveis. Ela não dispensa uma programação cuidadosa, porém elimina alguns tipos de erros de programação
1
Compilador Just-In-Time (JIT) é o compilador que altera a maneira na qual programas em Java são executados, geralmente otimizando-os e tornando-os mais rápidos.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 2 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
possíveis em outras linguagens. A ausência da aritmética de ponteiros também exclui toda uma classe de erros relacionados a esse tipo de estrutura. O o a arrays strings, e a conversão de tipos são checados em tempo de execução para assegurar a sua validade. O Garbage Collector2 faz a desalocação automática de memória evitando, erros de referência e desperdício de memória. Finalmente, o recurso de Exception Handling permite o tratamento de erros em tempo de execução, por um mecanismo robusto, análogo ao do C++. Java é também uma linguagem portável e multiplataforma! O Compilador é capaz de gerar um código intermediário (bytecode), que permite que o mesmo programa possa ser executado em qualquer máquina ou sistema operacional que possua uma JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado). Dessa forma, aplicações funcionam da mesma maneira em qualquer ambiente. Podemos dizer que Java é uma linguagem concorrente ou multithreaded, i.e., pode realizar diversas tarefas assincronamente com o uso de threads, que são adas de modo nativo. Java torna a manipulação de threads tão simples quanto trabalhar com qualquer variável. Java é uma linguagem distribuída, i.e., foi projetada para trabalhar em um ambiente de redes, oferecendo bibliotecas para facilitar a comunicação, manipulando objetos distribuídos e oferecendo e à conectividade (Ex: URL, Sockets, Protocolos, etc). Ela também é uma linguagem segura, implementando encapsulamento, restringindo o o e a execução de diversos programas, tratando exceções, etc. Além disso, possui um verificador de bytecodes, que investiga e procura códigos maliciosos que eventualmente podem ter sido inseridos, rompendo com a integridade dos dados. Por fim, ele também possui o Security Manager, utilizado para impedir, por exemplo, que applets executem códigos arbitrariamente. Isso impede o o direto a informações pela memória ou inserir código estranho. 16712855225
Para finalizar, cabe salientar que Java é uma linguagem absurdamente extensível. Por que, professor? Porque ela integra diversas bibliotecas com o código nativo, além de permitir o carregamento dinâmico de classes em tempo de execução. Em outras palavras, os programas são formados por uma coleção de classes armazenadas independentemente e que podem ser carregadas no momento de utilização. 2
Garbage Collector (ou Coletor de Lixo) é o responsável pela automação do gerenciamento de memória. Ele é capaz recuperar uma área de memória inutilizada por um programa, evitando vazamento de memória.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 3 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: PLATAFORMA JAVA
Java é tanto uma plataforma quanto uma linguagem de programação orientada a objetos que permite o desenvolvimento de aplicações em diversas plataformas diferentes. Como já foi dito anteriormente, Java está presente desde dispositivos pequenos (Smartphone, Tablet, etc) a máquinas de grande porte (Servidores, Mainframes, etc). A linguagem Java possui quatro ambientes de desenvolvimento: Java Standard Edition (Java SE): trata-se de uma ferramenta de desenvolvimento para a Plataforma Java. Ela contém todo o ambiente necessário para a criação e execução de aplicações Java, incluindo a Máquina Virtual (JVM), Compilador (Javac), Bibliotecas (APIs), entre outras ferramentas. Em geral, rodam em computadores pessoais, notebooks, etc. Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de sistemas corporativos, voltada para aplicações multicamadas, baseadas em componentes executados em servidores de aplicações – ele inclui o Java SE. Contém bibliotecas para o a base de dados, RPC, CORBA, entre outras. As aplicações podem ou não estar na internet. Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. Java Card: tecnologia que permite que pequenos aplicativos baseados em Java (conhecidos como Applets) sejam executados com segurança em smartcards e outros dispositivos similares com grandes limitações de processamento e armazenamento. Sabe o chip do seu celular? Java Card! Sabe o chip do cartão de crédito? Java Card! 16712855225
Java FX: trata-se de uma plataforma de software multimídia para a criação e disponibilização de Rich Internet Application (RIA) que pode ser executada em diversos dispositivos diferentes. Ele permite a criação de aplicações ricas para navegadores, smartphones, televisores, video-games, blu-rays, etc – são os menos conhecidos.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 4 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Um programa escrito para a plataforma Java necessita de um ambiente de execução chamado Java Runtime Environment (JRE)! O que tem nesse negócio, professor? Ele contém uma Máquina Virtual (JVM) e Bibiliotecas (APIs). E o Java Development Kit (JDK)? Bem, eles contêm a JRE e outros componentes úteis para executar aplicações (Exemplo: Javac, Javadoc, Jar, Appletviewer, Jconsole, Jstack, Jhat, etc). Portanto, é o seguinte: se você deseja somente executar alguma aplicação Java no seu computador ou navegador, basta instalar um JRE! No entanto, se você planeja programar em Java, você precisará de um JDK (que contém a JRE)! Entenderam? É bastante simples! JRE é o mínimo que você precisa para rodar uma aplicação e o JDK é o que você precisa para desenvolver uma aplicação!
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 5 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
JAVA: COMPILAÇÃO E INTERPRETAÇÃO
A Linguagem Java tem dois processos de execução de código-fonte: Compilação e Interpretação! Vamos lá... o programador escreve um código em Java em um editor de texto, por exemplo. Ele salva com a extensão .java e a por um compilador (JavaC)! Esse compilador transforma o arquivo .java em código de máquina e em um arquivo .class, também chamado bytecode – como mostra a imagem abaixo.
O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um programa que carrega e executa os aplicativos Java, convertendo bytecodes em código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é, isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java.
16712855225
Por conta deles, programas escritos em Java podem funcionar em qualquer plataforma de hardware e software que possua uma JVM, tornando assim essas aplicações independentes da plataforma, como apresenta a imagem acima (Win32, Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 6 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
UNIX e MacOS)! Galera, qualquer plataforma... desde um computador a uma geladeira. A imagem abaixo é similar à anterior, apenas para solidificar!
Uma observação importante: Código Java é sempre compilado em um bytecode. No entanto, nem todo bytecode é proveniente de Código Java. Como assim, professor? É isso mesmo! Por exemplo: eu posso compilar o Código Ada em um bytecode e rodá-lo em uma JVM! E quais outras linguagens? Temos também Eiffel, Pascal, Python, C. A JVM é capaz de entender bytecodes – assim como nós somos fluentes em português, ela é fluente em bytecode. Para criar bytecodes, basta seguir um conjunto de regras de formação. Logo, se existe um compilador que seja capaz de transformar o código-fonte (de qualquer linguagem) em uma bytecode seguindo as especificações corretamente, o bytecode poderá ser interpretado por uma JVM. 16712855225
CURIOSIDADE A Sun Microsystems declarou recentemente que existem atualmente cerca de 5.5 bilhões de dispositivos executando uma Java Virtual Machine (JVM).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 7 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: AGEM POR VALOR E POR REFERÊNCIA
Vamos falar sobre agem de parâmetros por valor e por referência. Vocês sabem que, quando o módulo principal chama uma função ou procedimento, ele a alguns valores chamados Argumentos de Entrada. Esse negócio costuma confundir muita gente, portanto vou explicar por meio de um exemplo, utilizando a função DobraValor(valor1, valor2) – apresentada na imagem abaixo: #include <stdio.h> void DobraValor(int valor1, int valor2) { valor1 = 2*valor1; valor2 = 2*valor2; printf("Valores dentro da Função: \nValor 1 = %d\n Valor 2 = %d\n",valor1,valor2); } int main() { int valor1 = 5; int valor2 = 10; printf("Valores antes de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2); DobraValor(valor1,valor2); printf("Valores depois de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2); return(); }
Essa função recebe dois valores e simplesmente multiplica sua soma por dois. Então o que acontece se eu ar os parâmetros por valor para a função? Bem, ela receberá uma cópia das duas variáveis e, não, as variáveis originais. Logo, antes de a função ser chamada, os valores serão os valores iniciais: 5 e 10. Durante a chamada, ela multiplica os valores por dois, resultando em: 10 e 20. Valores Valor 1 Valor 2 Valores Valor 1 Valor 2 Valores Valor 1 Valor 2
antes de chamar a Função: = 5 = 10 dentro da Função: = 10 = 20 depois de chamar a Função: = 5 = 10
16712855225
Após voltar para a função principal, os valores continuam sendo os valores iniciais: 5 e 10, como é apresentado acima na execução da função. Notem que os valores só se modificaram dentro da função DobraValor( ). Por que, professor? Ora, porque foi ada para função apenas uma cópia dos valores e eles que foram multiplicados por dois e, não, os valores originais.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 8 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 #include <stdio.h> void DobraValor(int *valor1, int *valor2) { *valor1 = 2*(*valor1); *valor2 = 2*(*valor2); printf("Valores dentro da Função: \nValor 1 = %d\n Valor 2 = %d\n", *valor1, *valor2); } int main() { int valor1 = 5; int valor2 = 10; printf("Valores antes de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2); DobraValor(&valor1,&valor2); printf("Valores depois de chamar a Função:\nValor 1 = %d\nValor 2 = %d\n",valor1,valor2); return(); }
Professor, o que ocorre na agem por referência? Bem, ela receberá uma referência para as duas variáveis originais e, não, cópias. Portanto, antes de a função ser chamada, os valores serão os valores iniciais: 5 e 10. Durante a chamada, ela multiplica os valores por dois, resultando em: 10 e 20. Após voltar para a função principal, os valores serão os valores modificados: 10 e 20. Valores Valor 1 Valor 2 Valores Valor 1 Valor 2 Valores Valor 1 Valor 2
antes de chamar a Função: = 5 = 10 dentro da Função: = 10 = 20 depois de chamar a Função: = 10 = 20
Notem que os valores se modificaram não só dentro da função DobraValor( ), como fora também (na função principal). Por que isso ocorreu, professor? Ora, porque foi ada para função uma referência para os valores originais e eles foram multiplicados por dois, voltando à função principal com os valores dobrados! Por isso, os valores 10 e 20. 16712855225
Resumindo: a agem de parâmetro por valor recebe uma cópia da variável original e qualquer alteração não refletirá no módulo principal. A agem de parâmetro por referência recebe uma referência para a própria variável e qualquer alteração refletirá no módulo principal. Agora atenção máxima: em Java, a agem de parâmetros é sempre, sempre, sempre por valor! Bacana?
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 9 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: EMPACOTAMENTO
Utilizamos pacotes para organizar as classes semelhantes! Grosso modo, pacotes são apenas pastas ou diretórios do sistema operacional onde ficam armazenados os arquivos fonte de Java e são essenciais para o conceito de encapsulamento, no qual são dados níveis de o às classes. O empacotamento gera um arquivo .jar, que pode ser adicionado no classpath de uma aplicação. Uma vez criada uma pasta (que será um pacote), deve-se definir para as classes a qual pacote elas pertencem. Isso é feito pela palavra-reservada package: package br.com.site.pacoteEstrategia;
Essa deve ser a primeira linha de comando a ser compilada na classe. Java possui vários pacotes com outros pacotes internos e várias classes já prontas para serem utilizadas. Dentre os pacotes, podemos determinar dois grandes: o pacote java, que possui as classes padrões para o funcionamento da linguagem; e o pacote javax, que possui pacotes de extensão que fornecem ainda mais classes e objetos. Em geral, aquelas classes fortemente conectadas às funções nativas do sistema operacional pertencem ao pacote java e as que não são tão fortemente conectadas pertencem ao pacote javax. Para utilizar os milhares de classes contidas nos inúmeros pacotes de Java devemos nos referenciar diretamente a classe ou importá- . Para importar um pacote usamos a palavra-reservada import. import javax.swing.JOptionPane;
Para separar um pacote de seu sub-pacote, usam-se pontos (br.com.site.pacoteEstrategia). Ao utilizar o asterisco (*), todos os subpacotes do pacote são importados: import java.awt.* - isso importa todos os sub-pacotes pertencentes ao pacote java.awt. entanto, podemos definir diretamente o pacote desejado: import javax.swing.JOptionPane. Isso irá importar apenas o sub-pacote JOptionPane do pacote javax.swing. 16712855225
A diferença entre as duas formas de importação de pacotes é o consumo de recursos do computador. Como o asterisco importa todos os sub-pacotes, o consumo de memória será alto e, muito provavelmente, não usaremos todas as classes de todos os pacotes importados. Por isso, o recomendado é sempre importar apenas o pacote que será utilizado. A ordem é Package, Import e Class.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 10 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: RAÍZ
Muitas linguagens orientadas a objetos (como o C++) não am a noção de existir uma única classe a partir da qual todas as outras classes são derivadas, sem que isso seja um impedimento à linguagem. Entretanto, na linguagem Java, a falta desse tipo de classe tornaria a linguagem limitada. Todos os objetos da linguagem Java são de múltiplas camadas. Cada classe, na hierarquia de classes, representa uma camada que adiciona diversas capacidades a um objeto. No topo desta hierarquia você sempre vai encontrar uma classe chamada de Object (Objeto). Qualquer classe estende implicitamente (sem necessidade de declarar) a classe Object. Claro que, na maioria das vezes, isso ocorre indiretamente. Bacana, pessoal?
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 11 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
JAVA: SINTAXE JAVA: IDENTIFICADORES
Antes de tudo, é importante ressaltar que o Java é case-sensitive (Flamengo é diferente de flamengo). Identificador é o nome utilizado para representar variáveis, classes, objetos, métodos, pacotes, interfaces, etc. Por exemplo: na matemática, utiliza-se um nome para as incógnitas (x, y, z) que é o identificador daquela incógnita. No Java, existem um conjunto de regras para criação do identificador: Deve ser a combinação de uma ou mais letras e dígitos UNICODE-16: Letras: A-Z; Letras: a-z; Underscore: _ ; Cifrão: $ ;Números: 0-9. 1. 2. 3. 4.
Não pode ser uma palavra-reservada (palavra-chave); Não pode ser true, false ou null; Não pode começar com números; Não pode conter espaços em branco ou caracteres de formatação;
//CORRETO int MyVariable, myvariable, MYVARIABLE; int x, i, , OReilly; int _myvariable, $myvariaBle, _9pins; //INCORRETO int My Variable; int 9pins; int a+c, test-1, o'reilly&;
//Contém espaço //Começa com um dígito //Contém caractere não-alfanumérico
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 12 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: BLOCOS E COMANDOS
Blocos de programação são aglomerados de instruções e declarações que têm escopo conjunto. Em outras palavras, as variáveis definidas como locais dentro de um bloco somente serão presentes dentro deste bloco, assim como as instruções ali presentes. Os blocos de programação são delimitados por chaves { } e podem ser aninhados, já os comandos sempre são terminados com ponto-e-vírgula. import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { //Início Bloco 1 int a = 10; int b = 1; if (b==3) { //Início Bloco 2 b = a*10; } else { //Início Bloco 3 int a = 100; b = a*10; } System.out.println("O valor de b é " + b); } }
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 13 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: COMENTÁRIOS
Os comentários, como o próprio nome preconiza, são notas que podem ser incluídas no código-fonte de um programa para descrever o que o desenvolvedor desejar. Dessa forma, eles não modificam o programa executado e servem somente para ajudar o programador a melhor organizar os seus códigos. Os comentários em Java seguem a mesma sintaxe da linguagem C++: import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { /** * Comentário de mais de uma linha! **/ int a = 10; int b = (int)(a*3.141592); //Comentário de única linha! System.out.println("O valor de b é " + b); } }
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 14 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: PALAVRAS RESERVADAS
Java possui 52 palavras-reservadas: três palavras para modificar o; treze palavras para modificar classes, variáveis e métodos; doze palavras para controle de fluxo; seis palavras para tratar erros; duas palavras para controlar pacotes; oito palavras para tipos primitivos; duas palavras para variáveis de referência; uma palavra para retorno de método; e duas palavras reservadas não utilizadas. Espera, professor! Mas eu contei e deu 49 palavras! É que null true false não são consideradas tecnicamente palavras-reservadas, mas valores literais. No entanto, isso é só tecnicamente, porque caso se tente criar identificadores com essas palavras, resultará em erro de compilação. Vamos ver todas as palavras reservadas? A tabela abaixo apresenta cada uma e sua descrição:
Palavras abstract
boolean
Descrição Aplicado a um método ou classe indica que a implementação completa deste método ou classe é efetuada posteriormente, por uma subclasse. Caso seja uma classe, significa que ela não pode ser instanciada. É um tipo de dados cujos valores podem ser true ou false.
break
Comando para controle de laço, no estilo C/C++.
byte
Tipo de dados inteiros com sinal, armazenado em formato binário na notação de complemento a dois e tamanho de 8 bits.
case
Indica uma opção entre várias em blocos switch. 16712855225
catch
É utilizado juntamente com try, seu bloco é executado somente em caso de o programa lançar uma exceção do tipo indicado no seu parâmetro.
char
Para variáveis de caracteres, onde a sua representação interna equivale a um tipo numérico.
class
Para definir o início de um arquivo Java, todas as classes possuem pelo menos essa palavra-chave.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 15 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
const
Essa palavra não tem uso específico em Java mas mesmo assim é uma palavra-chave.
continue
Para pular a iteração atual de uma estrutura de repetição.
default
Normalmente utilizado para o final de uma ou mais opções case´s de um bloco catch.
do
Estrutura de repetição que garante que o bloco será executado pelo menos uma vez durante a execução do programa.
double
Para variáveis numéricas e de pontos flutuantes com precisão de 64 bits.
else
Complemento de estrutura de condição.
enum
Palavra-chave adicionada na versão 5 do Java; é um tipo específico de dados que assemelha-se com uma classe que tem operações e dados internos.
extends
Utilizado para aplicar o conceito de herança para uma classe, onde uma classe receberá os métodos e variáveis de instância da classe chamada de pai. Marca uma variável, classe ou método para que não seja possível modificar o seu valor ou comportamento no decorrer da execução do programa.
final
finally
float
Compõe o início de um bloco que sempre é executado para um bloco de tratamento de erros, mais utilizado para limpar recursos que foram abertos no bloco de tratamento. Variáveis numéricas e de pontos flutuantes com precisão de 32 bits. 16712855225
for
Estrutura de repetição que declara, testa e incrementa variável para uso local.
goto
Não tem uso específico na linguagem.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 16 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
if
Estrutura de condição mais comum na linguagem.
implements
Informa que uma determinada classe irá implementar uma determinada interface.
import
Para relacionar classes externas à atual, permitindo o uso de nomes mais curtos para recursos da classe externa.
instanceof
Testa se um objeto é uma instância de uma classe específica ou se é null.
int
Para variáveis numéricas de precisão -2.147.483.648 até 2.147.483.647.
interface
long
native
new
Informa que o modelo não é uma classe, mas sim um protótipo de classe sem implementação para os métodos, obrigando as classes que a implementarão a seguir as determinadas regras. Para variáveis numéricas de precisão de 64 bits.
Métodos marcados como native dizem que sua implementação é feita em uma outra linguagem (por exemplo, C), para que se possa ar recursos específicos do sistema operacional. Utilizada para se criar novas instâncias de objetos. 16712855225
package
Informa em que estrutura de diretórios a classe está localizada.
private
Marca a visibilidade de um método ou variável de instância para que apenas a própria classe e.
protected
Marca a visibilidade de um método ou variável de instância para que a própria classe ou suas filhas em.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 17 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
public
Marca a visibilidade de uma classe, método ou variável de instância para que todas as classes em todos os pacotes tenham o.
return
Devolve para o método chamador de um valor que é do mesmo tipo declarado na do método.
short
Para variáveis numéricas de precisão de -32.768 até 32.767.
static
Marca um método ou variável para que se tenha apenas uma cópia da memória desse membro.
strictfp
Serve para aumentar a precisão em operações com pontos flutuantes.
super
Chama membros da classe-pai.
switch
Representa blocos de decisões de fluxos semelhantes ao if, mas com mais organização em determinadas situações.
synchronized Um método com essa marcação será controlado para que não se possa ter duas threads ando o mesmo objeto. this
Representa a instância que está atualmente sendo executada.
throw
É utilizado para lançar uma exceção.
throws
É utilizado para se declarar que um método pode lançar uma exceção.
16712855225
transient
Indica que uma determinada variável de instância não será serializada junto com o objeto da classe.
try
Para executar métodos que têm chances de lançar exceções, mas que serão tratados em blocos catch que o seguirão.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 18 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
void
Representa um retorno vazio, i.e., nenhum retorno para esse método.
volatile
Indica que uma determinada variável de instância pode ser modificada em duas threads distintas ao mesmo tempo.
while
Bloco de repetição que será executado enquanto seu parâmetro estiver retornando true.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 19 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: TIPOS PRIMITIVOS
A linguagem Java oferece um total de oito tipos primitivos para criação de programas. Esses tipos são utilizados para declarar variáveis que auxiliam na construção dos algoritmos. Apesar de a linguagem oferecer tantos tipos, muitos deles são capazes de representar os mesmos tipos de dados, mas com uma capacidade de armazenamento maior (maior quantidade de bits). Variáveis do tipo byte, short, int e long, por exemplo, podem ser usadas para representar números inteiros, variando em diferentes faixas de valores, embora os tipos int e long sejam os mais utilizados. O mesmo acontece com variáveis do tipo float double, que são usadas para representar números reais. O tipo boolean é usado para declarar variáveis que podem assumir um os valores: true ou false.
NOME
TIPO
TAMANHO
LÓGICO CARACTERE
boolean char byte short int long float double
16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits
INTEIRO
DECIMAL
MÍNIMO
MÁXIMO
false true 0 216 – 1 -27 27 – 1 -215 215 – 1 -231 231 – 1 -263 263 – 1 7 Casas Decimais 15 Casas Decimais
DEFAULT false ‘\u0000’ 0 0 0 0 0.0 0.0
Variáveis booleanas são bastante usadas em comandos condicionais ou de repetição. Finalmente, o tipo char é utilizado para representar caracteres, como, por exemplo, as letras de alfabetos de línguas de diferentes países. Apesar de, em alguns programas, ser necessário o uso do tipo char para representar e permitir o processamento de caracteres de uma frase, o mais comum é usar a classe String. 16712855225
Galera, vou enfatizar isso novamente porque é realmente importante! String não é um Tipo Primitivo! Bacana? String não é um Tipo Primitivo, nunca foi e jamais será um Tipo Primitivo. Além disso, a Classe String pertence ao pacote Lang e herda diretamente de Object. Outra coisa: posso escrever números na forma decimal (8), octal (08) ou hexadecimal (0x8).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 20 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
OBSERVAÇÕES O valor-padrão para um número decimal é Double; se o programador quiser que seja Float, deve enviar como parâmetro o valor acrescido da letra f (Ex: 3.14f). Da mesma forma, o valor-padrão para inteiro é um int. O único tipo primitivo que não pode ser atribuído a nenhum outro tipo é o boolean.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 21 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: OPERADORES
Os operadores são sinais que representam atribuições, cálculos e ordem dos dados. As operações seguem uma ordem de prioridades, ou seja, alguns cálculos são processados antes de outros, assim como ocorre na matemática. Para manipular os valores das variáveis de um programa, devemos utilizar os operadores oferecidos pela linguagem de programação adotada.
ARITMÉTICOS + * / %
ATRIBUIÇÃO = += -= *= /= %= ++ --
RELACIONAIS > < >= <= != == ? instanceof
LÓGICOS ! && ||
BIT A BIT & | ^ << >> >>>
Operadores Aritméticos: +, -, *, /, %. $Numero $Numero $Numero $Numero $Numero
= = = = =
2 8 2 8 2
+ * / %
8; 2; 8; 2; 8;
//$Numero //$Numero //$Numero //$Numero //$Numero
= = = = =
2 8 2 8 2
+ * / %
8 2 8 2 8
= = = = =
10 6 16 4 8 (Resto da divisão de 2 por 8)
String $palavra1 = "Alô"; String $palavra2 = "Mundo!"; String $frase = $palavra1 + ", " + $palavra2; //$frase = "Alô, Mundo!"
Operadores de Atribuição: =, +=, -=, *=, /=, %=, ++, --. 16712855225
int $Numero = 5;
//Atribui-se o valor 5 a variável $Numero
$Numero ++; $Numero --;
//$Numero = $Numero + 1 = 5 + 1 = 6 //$Numero = $Numero - 1 = 6 1 = 5
$Numero += 3; $Numero -= 3;
//$Numero = $Numero + 3 = 5 + 3 = 8 //$Numero = $Numero - 3 = 8 3 = 5
$Numero *= 3; $Numero /= 3;
//$Numero = $Numero * 3 = 5 * 3 = 15 //$Numero = $Numero / 3 = 15 / 3 = 5
$Numero %= 3;
//$Numero = $Numero % 3 = 5 % 3 = 2 (Resto da divisão de 5 por 3)
Operadores Relacionais: >, <, >=, <=, ==, != , ? , instanceof.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 22 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 boolean Variavel_1; Variavel_1 Variavel_1 Variavel_1 Variavel_1 Variavel_1 Variavel_1
= = = = = =
4 4 3 3 1 2
< <= > >= == !=
4; 4; 7; 7; 1; 1;
//FALSE: //TRUE: //FALSE: //FALSE: //TRUE: //TRUE:
4 4 3 3 1 2
não é menor que 4 é menor ou igual a 4 não é menor que 7 não é maior ou igual a 7 é igual a 1 é diferente de 1
int Variavel_2 = 4; int Variavel_3 = 8; Variavel_2 = (Variavel_2 > Variavel_3)? Variavel_2: Variavel_3; //Variavel_2: 4 não é maior que 8, logo Variavel_2 recebe o valor de Variavel_3 Variavel_3 = (Variavel_2 < Variavel_3)? Variavel_2: Variavel_3; //Variavel_3: 4 é menor que 8, logo Variavel_3 recebe o valor de Variavel_2 Moto $cg500 = new Moto(); Carro $celta = new Carro(); boolean Teste = $celta instanceof Carro; //TRUE: $celta é uma instância de Carro boolean Teste = $cg500 instanceof Carro; //FALSE: $cg500 não é uma instância de Carro
Vamos ver abaixo um exemplo mais complexo: //Caso 1: y = 2 e x = 2 int x = 0; int y = x++ + ++x; //Caso 2: y = 1 e x = 2 int x = 0; int y = x++ + x++; //Caso 3: y = 3 e x = 2 int x = 0; int y = ++x + ++x; //Caso 4: y = 2 e x = 2 int x = 0; int y = ++x + x++;
Operadores Lógicos: !, &&, ||. 16712855225
boolean $Variavel; $Variavel = (2<45) && (45<2) //$Variavel = TRUE && FALSE = FALSE $Variavel = (2<45) || (45<2) //$Variavel = TRUE || FALSE = TRUE !$Variavel //$Variavel = FALSE; !$Variavel //$Variavel = TRUE;
Operadores Bit a Bit: &, |, ^, <<, >>, >>>. int $Variavel; $Variavel = 34 & 435; $Variavel = 34^46; $Variavel = 436|547;
//000100010 & 110110011 = 100010 = 34 (Operação AND) //000100010 ^ 000101110 = 000001100 = 12 (Operação XOR) //0110110100 | 1000100011 = 1110110111 = 951 (Operação OR)
int $Variavel = -3;
//$Variavel vale -3
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 23 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 $Variavel = $Variavel >> 1 $Variavel = $Variavel << 1; $Variavel = $Variavel >>> 1;
//$Variavel = 11111101 >> 1 = 11111110 = -2 (SHIFT RIGHT) //$Variavel = 11111110 << 1 = 11111100 = -4 (SHIFT LEFT) //$Variavel = 11111100 >>> 1 = NÚMERO GIGANTE
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 24 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: VETORES
Um vetor é uma estrutura de dados formada por um conjunto de dados ou outros elementos de um mesmo tipo, podendo ter uma dimensão ou mais (quando tem duas, é chamado de matriz) e cujo o aos dados é feito através de índices. Cada item de um vetor é chamado de elemento. Cada um dos elementos possui uma posição dentro do vetor, à qual referenciamos através do índice do elemento. Para declarar um vetor e de uma matriz, devemos utilizar a seguinte sintaxe: //Declaração 1 tipo[] identificador1; tipo identificador1[]; //Declaração 2 tipo[] identificador2 = new tipo[]; tipo identificador2[] = new tipo[]; //Declaração 3 (Para duas dimensões) tipo[][] identificador3; tipo identificador3[][];
Para inicializar um vetor, devemos utilizar a seguinte sintaxe: //Inicialização 1 int[] Vetor1 = {34,27,91,56}; //Inicialização 2 (Inválida) int[] Vetor2 = new int[4]; Vetor2 = {34,27,91,56}; //Inicialização 3 int[] Vetor3 = new int[4]; Vetor3[0] = 34; Vetor3[1] = 27; Vetor3[2] = 91; Vetor3[3] = 56; 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 25 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: CONVERSÃO DE TIPOS
Muitas vezes precisamos fazer cálculos e guardar o resultado em alguma outra variável para uso posterior, porém o tipo de resultado pode não condizer com o tipo da variável que irá receber esse resultado, seja de outra variável ou resultado de uma expressão matemática. A conversão de tipos primitivos é a transformação de um tipo para outro. Essas conversões podem ser implícitas ou explícitas.
As conversões implícitas ocorrem quando atribuímos um valor de menor tipo em uma variável de tipo maior. Este tipo de conversão também é conhecido como conversão de ampliação e ocorrerá de forma automática porque um valor de menor tipo sempre caberá em uma variável de maior tipo. Podemos ver um exemplo representado abaixo: import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { System.out.println("Conversão Implícita:"); double a1 = 10*5.2 + 4 - 1.3; System.out.println("Variável a1 = " + a1); double a2 = 5/2; System.out.println("Variável a2 = " + a2); double a3 = 5/2.0; System.out.println("Variável a3 = " + a3); 16712855225
System.out.println("\nConversão Explícita:"); int a4 = (int) (10*5.2 + 4 - 1.3); System.out.println("Variável a4 = " + a4); int a5 = (int) (5/2.0); System.out.println("Variável a5 = " + a5); } }
O resultado das conversões implícitas e explícitas são apresentados abaixo: Conversão Implícita: Variável a1 = 54.7
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 26 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 Variável a2 = 2.0 Variável a3 = 2.5 Conversão Explícita: Variável a4 = 54 Variável a5 = 2
A conversão explícita ou de redução ocorre quando precisamos atribuir um valor de tipo maior para uma variável de tipo menor. Nesse caso, precisamos informar diretamente entre parênteses (antes da variável, literal ou resultado de uma expressão) o tipo de dado que vamos converter. Existem 19 conversões implícitas e 22 conversões explícitas possíveis.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 27 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: CONTROLE DE FLUXO
Professor, o que é Controle de Fluxo? É como se controla o fluxo de um código, isto é, como um programa executa suas tarefas! Por meio de comandos, tarefas podem ser executadas seletivamente, repetidamente ou excepcionalmente. Não fosse o controle de fluxo, um programa poderia executar apenas uma única sequência de tarefas, perdendo seu dinamismo. Em Java, temos duas estruturas: Seleção e Repetição. A Estrutura de Seleção (ou Condição) consiste basicamente dos comandos if-else. Ele é empregado para executar seletivamente ou condicionalmente um outro comando mediante um critério de seleção. Esse critério é dado por uma expressão, cujo valor resultante deve ser um dado do tipo booleano, isto é, true ou false. Se esse valor for true, então o outro comando é executado; se for false, a execução do programa segue adiante. A sintaxe do if-else é apresentada abaixo: if(CondiçãoBooleana) { comando1; comando2; (...) comandoN; } else { comando1; comando2; (...) comandoN; }
Uma variação desse comando, o if-else permite escolher alternadamente entre dois outros comandos a executar. Nesse caso, se o valor da expressão condicional que define o critério de seleção for true, então o primeiro dos outros dois comandos é executado, do contrário, o segundo. Lembrando que é possível aninhar ou combinar vários comandos else e if – o último else é opcional. 16712855225
int idade; if (idade <= 1) System.out.println( Bebê ); else if(idade > 1 && idade <= 10) System.out.println( Criança ); else if(idade > 10 && idade <= 13) System.out.println( Pré-adolescente ); else if(idade > 13 && idade <= 18) System.out.println( Adolescente ); else System.out.println( Adulto );
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 28 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Existem algumas situações em que se sabe de antemão que as condições assumem o valor true de forma mutuamente exclusiva, i.e., apenas uma entre as condições sendo testadas assume o valor true ao mesmo momento. Nesses casos, a linguagem Java provê um comando de controle de fluxo bastante poderoso. Trata-se do comando swich, cuja sintaxe é a seguinte: switch([expressão]) case [constante [comando 1] break; case [constante [comando 2] break; ... case [constante [de comando break; default: [comando] }
{ 1]:
2]:
n]: n]
A [expressão] pode ser qualquer expressão válida. Ela é avaliada e o seu valor resultante é comparado com as constantes distintas [constante 1], [constante 2], ..., [constante n]. Caso esse valor seja igual a uma dessas constantes, o respectivo comando é executado (e todos os demais são saltados). Se o valor for diferente, o comando presente sob o rótulo default: é executado. Vejamos outro exemplo: int mesAtual = 5; switch (mesAtual) { case 1: System.out.println("Janeiro"); break; case 2: System.out.println("Fevereiro"); break; case 3: System.out.println("Março"); break; case 4: System.out.println("Abril"); break; case 5: System.out.println("Maio"); break; case 6: System.out.println("Junho"); break; case 7: System.out.println("Julho"); break; case 8: System.out.println("Agosto"); break; case 9: System.out.println("Setembro"); break; case 10: System.out.println("Outubro"); break; case 11: System.out.println("Novembro"); break; case 12: System.out.println("Dezembro"); break; default: System.out.println("Mês inválido."); } 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 29 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Chegamos, então, à Estrutura de Repetição (ou Iteração)! Frequentemente, desejamos que uma tarefa seja executada repetidamente por um programa enquanto uma dada condição seja verdadeira. Isso é possível pela utilização do comando while. Este comando avalia uma expressão condicional, que deve resultar no valor true ou false. Se o valor for true, então o comando subjacente é executado; se a expressão for false, então o comando é saltado e a execução prossegue adiante. A diferença é que após executar o comando subjacente, a expressão condicional é novamente avaliada e seu resultado novamente considerado. Desse modo a execução do comando subjacente se repetirá até que o valor da expressão condicional seja false. Observe, porém, que a expressão é avaliada antes de uma possível execução do comando subjacente, o que significa que esse comando pode jamais ser executado. O comando while é portanto pré-testado, isto é, antes de executar qualquer comando, testa-se a condição oferecida. Caso seja verdadeira, realiza os comandos internos; caso seja falsa, sequer realiza qualquer comando. A sintaxe é: while ([condição]) [comando subjacente]
Deve-se ter cuidado para não acabar implementando um laço infinito (desde que essa não seja sua intenção). Um laço infinito é um laço em que a condição de saída nunca é satisfeita, portanto ele roda eternamente. Uma variação do comando while que funciona de maneira bastante análoga é o do-while. A diferença é que ele é póstestado, isto é, executa os comandos internos e só depois avalia a condição. do [comando] while ([condição]);
16712855225
Em certas situações, precisamos de laços de repetições nos quais alguma variável é usada para contar o número de iterações. Para essa finalidade, temos o laço for. Este é o tipo de laço mais geral e mais complicado disponível na linguagem Java. Esse laço é pré-testado ou pós-testado? Fácil, é pré-testado! Avalia-se a condição antes de executar os comandos. Sua sintaxe é a seguinte: for ([expressão 1]; [condição]; [expressão 2]) [comando]
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 30 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
A [expressão 1] é chamada expressão de inicialização, [condição] é uma expressão condicional e [expressão 2] é uma expressão qualquer a ser executado no final de cada iteração. O laço for avalia inicialmente a expressão de inicialização. Em seguida, avalia a expressão condicional. Se o valor desta for true, então o comando é executado. A segunda expressão é avaliada em seguida, e finalmente o laço volta a avaliar novamente a expressão condicional. Do contrário, se o valor da expressão for false, a execução prossegue adiante do laço for. Observem que é completamente possível transformar um for em um while. Podemos dizer que eles são equivalentes, mas escritos de maneira diferente. [expressão 1] while ([condição]) { [comando] [expressão 2] }
Agora vamos ver um exemplo do while: int idade = 26; while (idade > 30) { System.out.println("Minha idade é " + idade); idade = idade + 1; } Resultado: ...
Agora vamos ver um exemplo do do-while: int idade = 26; 16712855225
do { System.out.println("Minha idade é " + idade); idade = idade + 1; } while (idade > 30) Resultado: Minha idade é 26
Agora vamos ver um exemplo do for: int idade; for (idade = 26; idade < 30; idade++) { System.out.println("Minha idade é " + idade); }
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 31 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 Resultado: Minha Minha Minha Minha
idade idade idade idade
é é é é
26 27 28 29
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 32 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
JAVA: ORIENTAÇÃO A OBJETOS JAVA: CLASSES
A classe é a planta ou esquema que indica como os objetos são criados, quais os seus comportamentos e variáveis de estado. Para declarar uma classe, é necessário utilizar a sintaxe a seguir: [palavra-chave] class NomeDaClasse { //Atributos e Métodos }
Portanto para declarar uma classe, deve-se colocar a palavra class seguida de um identificador que irá servir de nome para a classe. O identificador pode ser qualquer palavra, exceto palavras reservadas. Por exemplo: class Conta introduz a declaração de uma nova classe chamada Conta. Note que, por convenção, o nome de uma classe inicia sempre com uma letra maiúscula. A Palavra-Chave é opcional, podendo ser: //Essa classe pode ser ada por todos public class Carro {...} //Essa classe não pode gerar instâncias abstract class Carro {...} //Essa classe não pode ser estendida final class Carro {...}
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 33 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: OBJETOS
Um objeto é uma instância de uma classe. Para criar um objeto, devemos utilizar a seguinte sintaxe: new construtor();
O comando new, também conhecido como operador de criação, cria um novo objeto, alocando memória para o objeto e inicializando essa memória para valores default. Ele necessita de um operando: o construtor, que é o nome de um método especial que constrói o objeto. Uma vez construído, o objeto deve ser atribuído a uma variável, para que possa ser utilizado e referenciado no futuro. /* 1) Operador NEW é responsável por criar um objeto; * 2) NomeClasse() é o construtor da Classe NomeClasse; * 3) NomeObjeto é uma variável do Tipo NomeClasse; */ NomeClasse NomeObjeto = new NomeClasse(); /* Observem que é possível atribuir o objeto de uma * classe para uma variável de outra classe */
A linguagem Java assume a responsabilidade de destruir qualquer objeto criado que não esteja sendo usando. Para tal, utiliza um Coletor de Lixo (Garbage Collector), que é executado em intervalos regulares, examinando cada objeto para ver se ele ainda é referenciado por alguma variável. Caso o objeto não seja utilizado ao menos por uma variável, ele é destruído e sua memória é liberada.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 34 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: ATRIBUTOS
Um atributo ou campo é uma variável declarada no corpo de uma classe. Ele serve para armazenar o estado de um objeto (atributo de instância) ou o estado de uma classe (atributo de classe). A sintaxe de declaração de um atributo é a seguinte: [palavra-chave] tipoAtributo NomeAtributo [=expressão];
A Palavra-Chave é opcional, podendo ser: Final, Volatile, Static ou Transient class Empregado { final String Nome; volatile Salario; static Idade; transient Sexo; }
//Indica //Indica //Indica //Indica
que que que que
Nome é um atributo constante; Salário é modificável por threads distintas; Idade é compartilhada por todos objetos; Sexo não pode ser serializável;
Modificadores de o: class Empregado { public String nome; private int Salario; protected short Idade; char Sexo; }
//Nome: público //Salário: privado //Idade: protegido //Sexo: default
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 35 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: MÉTODOS
Java utiliza métodos para se referir a trechos de código que são associados a classes. Se os atributos servem para manter ou armazenar o estado ou o valor de um objeto, os métodos servem para descrever os comportamentos de um objeto ou classe. Um método é muito similar a uma função em C. A maior diferença é que os métodos da linguagem Java são declarados completamente dentro de uma classe. [Palavras-Chave] TipoRetorno NomeMetodo ([Lista de Parâmetros]) { //Corpo do Método }
A sintaxe de declaração de um método é apresentada acima. A Palavra-Chave é opcional, podendo ser: Abstract, Final, Static, Native e Synchronized //Indica que esse método não possui corpo abstract int soma (int a, int b) {//...//} //Indica que esse método não pode ser sobrescrito final int soma (int a, int b) {//...//} //Indica que esse método só pode ar atributos de classe e não pode ser sobrescrito static int soma (int a, int b) {//...//} //Indica que esse método foi escrito outra linguagem native int soma (int a, int b) {//...//} //Indica que esse método só é executável por uma thread por vez synchronized soma (int a, int b) {//...//}
Modificadores de o: public int soma (int a, int b) {//...//} private int soma (int a, int b) {//...//} protected int soma (int a, int b) {//...//} int soma (int a, int b) {//...//} 16712855225
Vamos falar agora sobre um método importante: Construtor! Ele é um método especial, chamado pelo operador new quando um novo objeto necessita ser criado. Dentro do construtor, pode-se colocar código customizado de inicialização do objeto. Em geral, ele deve ter o mesmo nome da classe em que for declarado. Além disso, um construtor não deve ter um tipo de retorno em sua declaração. Professor, não entendo uma coisa! Em geral, no código da classe não há nenhum método com o nome do método construtor. Ora, não há declaração de método Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 36 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
algum! Como é isso? É verdade! Basicamente, quando você não declara um construtor para uma classe, o compilador cria um construtor padrão com uma lista vazia de parâmetros. Pode-se criar diversos construtores para uma mesma classe. Outro método muito importante é o Método Main! Pois é, ele é sempre definido como um método de classe, i.e., possui um modificador static: public static void main (String[] args) throws java.lang.Exception
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 37 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: HERANÇA
Herança é a habilidade de se derivar alguma coisa específica a partir de algo mais genérico. Nós encontramos essa habilidade ou capacidade diversas vezes em nosso cotidiano. Por exemplo: um Pálio estacionado na garagem do seu vizinho é uma instância específica da categoria Carro, mais genérica. Da mesma forma, uma Honda CG 125 é uma instância específica da categoria mais genérica Moto. Se levarmos as categorias Carro e Moto para um outro nível mais elevado, as duas se relacionarão uma com a outra por serem instâncias específicas de uma categoria mais genérica ainda que elas: a categoria Veículo. Em outras palavras, carros e motos são veículos. A imagem abaixo esquematiza as relações entre Pálio, Carro, Honda CG 125, Moto e Veículo.
16712855225
Esse exemplo ilustrou a Herança Simples! Neste caso, uma entidade herda estados e comportamentos (atributos e métodos) de uma e somente uma categoria. O Pálio, por exemplo, herda da categoria Carro (e somente dela, diretamente). Em contraste, a Herança Múltipla permite que uma entidade herde diretamente comportamentos e estados de duas ou mais categorias ao mesmo tempo. Imagine um Empregado chamado José de uma empresa qualquer. Para ser mais específico, pense em José como sendo tanto Gerente quanto Contador Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 38 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
simultaneamente dessa empresa. Ele herdaria as capacidades de um Gerente e de um Contador, concordam? Portanto, em uma hierarquia de entidades, João herdaria de duas classes diferentes diretamente, como apresenta a imagem abaixo:
A sintaxe da herança sugere que você pode estender uma e somente uma classe. O Java não a Herança Múltipla, porque – segundo projetistas da linguagem – esse tipo de implementação poderia gerar confusão. Imagine, por exemplo, duas classes-base declarando um atributo que possua o mesmo nome mas com tipos diferentes. Qual dos dois a classe-filha deveria herdar? A mesma situação poderia acontecer com um método! Se dois métodos possuíssem o mesmo nome, mas diferentes listas de parâmetros ou tipos de retorno, qual deles a subclasse deveria herdar? Vocês percebem como isso poderia causar inconsistências de projeto? Para prevenir tais problemas, a linguagem Java rejeita a implementação de herança múltipla. 16712855225
Novas classes derivam capacidades (expressas como atributos e métodos) de classes já existentes. Isso faz com que o tempo de desenvolvimento de uma aplicação seja bem menor, pois classes já existentes e comprovadamente funcionais (livres de erros e já testadas) são reaproveitadas (ou reutilizadas). A sintaxe que expressa o conceito de extensão de classes é a seguinte:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 39 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 class NomeClasseFilha extends NomeClassePai { //Atributos e Métodos }
Essa sintaxe pode ser lida da seguinte forma: NomeClasseFilha estende NomeClassePai. Em outras palavras, NomeClasseFilha herda (ou deriva) capacidades (expressas através de atributos e métodos) de NomeClassePai. A NomeClasseFilha é conhecida como subclasse, classe derivada ou classe-filha e NomeClassePai é conhecida como superclasse, classebase ou classe-pai. A palavra-chave extends faz com que uma subclasse herde (receba) todos os atributos e métodos declarados na classe-pai (desde que ela não seja final), incluindo todas as classes-pai da classe-pai. A classe-filha pode ar todos os atributos e métodos não-privados. Ela herda, mas não a (ao menos diretamente) métodos e atributos privados. Todo objeto criado a partir de uma subclasse é também um objeto do tipo da sua superclasse (Ex: um objeto do tipo Carro também é um objeto do tipo Veículo). Essa afirmação implica o fato de que você pode atribuir um objeto de uma subclasse para uma referência criada ou declarada para um objeto de sua superclasse. Como assim, professor? Vejamos! //Objeto do tipo Carro é um objeto do tipo Veículo Veiculo v = new Carro();
A linha de código acima cria um objeto do tipo Carro e atribui sua referência à variável v. Note que essa variável v é uma variável que armazena referências para objetos do tipo Veículo. Esse tipo de atribuição é perfeitamente possível, já que um Carro é uma subclasse de Veículo. Através da variável v, é possível chamar os métodos que pertencem ao tipo Veículo. 16712855225
Portanto, pode-se utilizar esse artifício de nomeação para transformar uma classefilha em qualquer uma de suas classes-pai. Professor, é possível fazer o inverso? Pode-se atribuir uma classe-pai a uma classe-filha? Não, isso só pode ser feito por meio de um type cast. Assim, uma variável pode assumir momentaneamente outro tipo para que o programador possa utilizá-la.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 40 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: ENCAPSULAMENTO
Pessoal, nós já sabemos que para se descobrir o que um objeto pode fazer, basta olhar para as s de seus métodos públicos definidos na classe desse objeto – que formam uma interface de uso. A de um método é composta pelo seu nome e seus parâmetros. Por outro lado, para descobrir como um objeto realiza suas operações, deve-se observar o corpo de cada um dos métodos da classe. Os corpos dos métodos constituem a implementação das operações dos objetos. Professor, por que nós encapsulamentos classes, atributos e métodos Cara, por duas razões: desenvolvimento e manutenibilidade. O encapsulamento ajuda a aumentar a divisão de responsabilidades (ou coesão) e, dessa forma, fica mais fácil e rápido desenvolver sistemas em módulos. Da mesma forma, ele ajuda a manutenção, visto que para torna-se mais difícil fazer “besteiras” no código e atrapalhar manutenções futuras. Trazendo isso para a vida real, lidamos com encapsulamento o tempo inteiro. Você sabe como usar um controle remoto, mas você não sabe como ele funciona internamente. Encapsulase seu funcionamento interno e disponibiliza-se apenas sua interface ao usuário. Chegamos ao conceito de Modificadores de o! Eles são utilizados para modificar o modo como classes, métodos e variáveis são adas. Existem três modificadores de o e um quarto nível (o default/friendly), quando não se usa nenhum dos modificadores citados. Toda classe, método e variáveis de instância declaradas possuem um controle de o. Pessoal, esses Modificadores de o determinam quão íveis são esses elementos. Vamos vê-los agora em mais detalhes: 16712855225
: essa instrução indica que a classe, método ou atributo assim declaradas podem ser adas em qualquer lugar e a qualquer momento da execução do programa – é o modificador menos restritivo. <private>: essa instrução indica que métodos ou atributos (classes, não) assim declaradas podem ser adas dentro da classe que os criou. Subclasses até herdam-nos, mas não os am – é o modificador mais restritivo. <protected>: essa instrução indica que métodos ou atributos (classes, não) assim declaradas somente podem ser adas dentro do pacote em que está contida ou por subclasses no mesmo pacote. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 41 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
<default> também chamado friendly, não há palavra para esse modificador porque ele é, na verdade, a ausência de um modificador. Indica-se que a classe, método ou atributo podem ser adas por classes do mesmo pacote.
Especificador Privado (-)
(~) Protegido (#) Público (+)
Própria Classe Sim Sim Sim Sim
Subclasse Não Não* Sim Sim
Pacote Não Sim Sim Sim
Global Não Não Não Sim
OBSERVAÇÃO É importante ressaltar que, em caso de não haver modificador, a subclasse pode ou não ar os métodos e atributos da sua superclasse, e isso depende da localização da subclasse. Se ela estiver em um pacote diferente do pacote da superclasse, não poderá ar. Se estiver em um mesmo pacote da superclasse, poderá ar. Logo, para diferenciar o Modificador Pacote do Modificador Protegido, deve-se saber primeiramente se é desejável que a subclasse possa ter o a atributos e métodos da classe. Pensem comigo! ar ou editar propriedades de objetos, manipulando-as diretamente, pode ser muito perigoso e gerar muitos problemas. Por conta disso, é mais seguro, para a integridade dos objetos e, consequentemente, para a integridade da aplicação, que esse o ou edição sejam realizados através de métodos desse objeto. Utilizando métodos, podemos controlar como consultas e modificações são realizadas, controlando-as. Para tal, podemos utilizar Métodos Getters e Setters – para recuperar dados e inserir dados, respectivamente. Para o primeiro, utiliza-se o Método Get; para o segundo, utiliza-se o Método Set. Em geral, costuma-se declarar atributos como privados, e métodos e classes como públicos. 16712855225
class Classe1 { //Atributo privado private String Algo; //Método público para recuperar dados public String getAlgo() { return this.Algo; } //Método público para modificar/inserir dados public void setAlgo(String Algo) {
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 42 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 this.Algo = Algo; } }
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 43 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: INTERFACE
Galera, o que é uma Interface? É simplesmente um contrato! Quando vocês assinam o contrato do seguro de um carro, vocês estão se comprometendo a atender aquilo que lá está escrito. Analogamente, a interface é um contrato que obriga aqueles que a assinam a implementar os métodos lá presentes. Elas ajudam a padronizar implementações – entradas e saídas. Em outras palavras, é um recurso utilizado em Java para obrigar a um determinado grupo de classes a ter métodos ou propriedades em comum para existir em um determinado contexto, contudo os métodos podem ser implementados em cada classe de uma maneira diferente. Em geral, as interfaces são compostas basicamente de um conjunto de s de métodos públicos e abstratos. public interface FiguraGeometrica { public String getNomeFigura(); public int getArea(int vertice); public int getPerimetro(); }
A sintaxe para implementar uma Interface utiliza a palavra reservada implements: public class ClasseImplementadoraDeInterfaces implements FiguraGeometrica
Professor, qual a diferença entre uma Interface e uma Classe Abstrata? Bem, Interfaces não são classes; são, na verdade, entidades que não possuem qualquer implementação, apenas , sendo que todos os seus métodos são públicos e abstratos. Já as Classes Abstratas também contêm, em geral, métodos abstratos (sem corpo), mas podem ter vários métodos concretos. 16712855225
Uma Classe Abstrata pode, inclusive, não conter nenhum método abstrato, i.e., todos os seus métodos são concretos. No entanto, se uma classe tiver um único método abstrato que seja, ela será considerada uma Classe Abstrata. Aliás, uma Interface é também chamada de classe abstrata pura por conta disso, ou seja, não há impurezas (isto é, métodos concretos).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 44 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: POLIMORFISMO
A palavra Polimorfismo vem do grego: muitas formas. Trata-se da capacidade de um objeto poder se comportar de diversas formas dependendo da mensagem recebida Observem que isso não quer dizer que o objeto fica transformando seu tipo a todo momento. Na verdade, um objeto nasce com um tipo e morre com esse mesmo tipo. O que muda, então? É a forma como nós nos referimos a esse objeto! Existem dois tipos de polimorfismo: Polimorfismo Estático: ocorre quando uma classe possui métodos com mesmo nome, entretanto s diferentes, i.e., métodos de uma mesma classe se sobrecarregando. Pode ser chamada também de Sobrecarga ou Overloading. Ocorre em Tempo de Compilação e alguns não o consideram um tipo de polimorfismo, porque a é diferente. Polimorfismo Dinâmico: ocorre quando uma classe possui um método com mesmo nome e mesma que um método de sua suplerclasse, i.e., o método da classe-filha sobrescreve o método da classe-pai. Pode ser chamada também de Sobrescrita, Overriding, Redefinição ou Sobreposição. Ocorre em Tempo de Execução e é um corolário do conceito de herança. Professor, o que você quer dizer com mesma e diferente? É a mesma quantidade, tipo e ordem dos parâmetros. Em outras palavras: // Igual: quantidade, tipo e ordem public String Entendendo(int A, char B); public String Entendendo(int C, char D); // Diferente: quantidade diferente public String Entendendo(long A, long B, long C); public String Entendendo(long A, long B); 16712855225
// Diferente: tipo diferente public String Entendendo(long A, long B); public String Entendendo(char A, long B); // Diferente: ordem diferente public String Entendendo(int A, char B); public String Entendendo(char B, int A);
Agora vamos ver um exemplo de Polimorfismo Dinâmico. Eu pensei comigo mesmo: O que seria uma característica comum de praticamente todos os animais? Emitir sons! Observem que eu criei uma classe abstrata que possui um único método – também abstrato –, que não retorna valor algum e não recebe nenhum argumento. Vejam a classe abaixo: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 45 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 abstract class Animal { abstract void som(); }
Dito isso, vou criar dois animais do meu gosto pessoal: um gato e um cachorro! Bem, o gato é um animal! Que relacionamento é esse “é um”? Herança! Portanto as classes gato e cachorro serão classes filhas da superclasse Animal. Observem abaixo que ambas implementam o método abstract void som( ), porém cada uma a sua maneira, visto que gatos e cachorros emitem sons diferentes! class Gato extends Animal { void som() { System.out.println("MIAU!"); } } class Cachorro extends Animal { void som() { System.out.println("AUAU!"); } }
Pois bem! Vamos ver agora o Polimorfismo Dinâmico em ação. Criaremos um objeto do tipo Gato e atribuiremos a um objeto do tipo Animal. Professor, você pode fazer isso? Sim, porque Gato é filho de Animal – é similar a um casting implícito! Em seguida chamaremos o método som( ). Por fim, faremos o mesmo procedimento com o objeto do tipo Cachorro. public static void main(String[] args) { Animal animal = new Gato(); animal.som(); //Emite o som MIAU! Animal animal = new Cachorro(); animal.som(); //Emite o som AUAU! } 16712855225
Olha que bacana: existem dois métodos com exatamente o mesmo nome e mesma ! Como o compilador saberá qual deve ser chamado? Ele não saberá – tem que ser em tempo de execução. No primeiro momento, ele apresentará “MIAU!”, porque animal é nesse instante um gato. Depois fazemos outra atribuição e ele apresentará “AUAU”, porque animal naquele instante é um cachorro. O Polimorfismo Estático é bem mais simples! Imaginem que eu deseje fazer dois cálculos matemáticos. Primeiro somar três números e depois somar apenas dois números. Eu posso ter dois métodos com mesmo nome, mas s diferentes. Dessa forma, se eu ar três valores, ele saberá que é um método; e se eu ar dois valores, ele saberá que é outro método. Simples, não?
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 46 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 class Calculo { void soma(int a,int b){ System.out.println(a+b); } void soma(int a,int b,int c){ System.out.println(a+b+c); } public static void main(String args[]) { Calculo x = new Calculo(); x.soma(10,10,10); //Mesmo nome, mas diferente (3 valores) x.soma(20,20); //Mesmo nome, mas diferente (2 valores) } }
OBSERVAÇÃO Atributos com o mesmo nome na classe/subclasse substituem os herdados. Ademais, métodos declarados com a palavra-reservada final não podem ser redefinidos. Já os métodos abstratos devem ser redefinidos na subclasse ou declarados como abstratos para que sejam implementados pela classe-neta. Por fim, membros definidos na superclasse podem ser ados na subclasse por meio da palavra-reservada super, a menos que tenham sido declarados como privados.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 47 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
JAVA: CONCEITOS AVANÇADOS JAVA: INTERFACE GRÁFICA
A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes e interfaces que definem os componentes visuais necessários para construir uma interface gráfica de usuário. Vocês entenderam mais ou menos? O primeiro é um conjunto básico que serve de base para o segundo, que é um conjunto mais sofisticado. Os componentes Swing são implementados com nenhum código nativo – totalmente Java puro, i.e., apesar de serem sensivelmente mais lentos que os componentes nativos em AWT (Abstract Window Toolkit), eles oferecem uma maior liberdade aos programadores. O AWT (javax.awt) veio primeiro, é mais pesado, é gerado pelo sistema operacional, logo é dependente de plataforma. O Swing (javax.swing) é mais leve, é gerado por uma Máquina Virtual Java (JVM), logo é independente de plataforma. Galera, nem tudo é diferente! Vejam: ambos são fáceis de programar, porque a orientação a objetos proporciona alterar partes do programa, sem alterar toda a estrutura.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 48 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
O Swing mantém as funcionalidades dos componentes AWT! Ao acrescentarmos a letra “J” aos componentes AWT, as novas classes serão como componentes Swing, i.e., JButton, JTextField, JList tem os mesmos argumentos que Button, TextField e List – componentes AWT. Nós vamos ver logo à frente a definição de alguns componentes Swing. Professor, o que é um componente? Bem, os itens que aparecem em uma interface gráfica de interação com usuário (janelas, caixas de texto, botões, listas, caixas de seleção, entre outros) são chamados de componentes. Alguns componentes podem ser colocados dentro de outros componentes, por exemplo, uma caixa de texto dentro de uma janela. Abaixo podemos ver a definição básica dos principais componentes: JFrame: define janelas com título, borda e alguns itens definidos pelo sistema operacional como botão para minimizar ou maximizar; J: define um componente que basicamente é utilizado para agrupar nas janelas outros componentes como caixas de texto, botões, listas, entre outros; JTextField: define os campos de texto menores que podem ser preenchidos pelo usuário; JTextArea: define os campos de texto maiores que podem ser preenchidos pelo usuário; JField: define os campos de caixa de texto de formulários para digitar senhas; JButton: permite que os usuários indiquem quais ações ele deseja que a aplicação execute; 16712855225
JCheckBox: permite criar formulários com checkbox’s (aquelas caixinhas para você dar um check); JComboBox: permite criar formulários com combobox’s (aquela listinha de opções). Agora vamos falar um pouquinho sobre o Layout Manager (ou Gerenciador de Disposição)! Galera, uma coisa é criar diversos componentes, outra coisa é posicioná-los e dimensioná-los. O Layout Manager é o objeto que determina como
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 49 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
elementos e componentes serão dispostos em tela, tamanhos, comportamentos, entre outros aspectos. Ele controla os componentes que estão dentro do componente ao qual ele está associado. Os principais Layout Managers são:
BorderLayout
FlowLayout
Divide a área de um componente de background em cinco regiões (norte, sul, leste, oeste e centro). Somente um componente pode ser adicionado em cada região. Eventualmente, o BorderLayout altera o tamanho preferencial dos componentes para torná-los compatíveis com o tamanho das regiões. O BorderLayout é o Layout Manager padrão de um JFrame.
Arranja os componentes da esquerda para direita e quando o tamanho horizontal não é suficiente ele “pula” para a próxima “linha”. O FlowLayout não altera o tamanho preferencial dos componentes. O FlowLayout é o Layout Manager padrão de um J (Swing).
16712855225
BoxLayout
Arranja os componentes de cima para baixo “quebrando linha” a cada componente adicionado. O BoxLayout não altera o tamanho preferencial dos componentes.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 50 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Divide a área de um componente de background em células semelhantemente a uma tabela. As células possuem o mesmo tamanho. GridLayout
É o mais complexo layout e é baseado no GridLayout. A ideia é representar a tela como um grid com linhas e colunas, mas podemos posicionar GridBagLayout elementos ocupando várias células em qualquer direção, o que permite layouts mais customizados (apesar do alto custo de manutenção). A definição de onde deve ser colocado cada componente é feita através de restrições (GridBagConstraints) adas ao método add.
16712855225
Professor, e o Look and Feel (L&F)? O “Look” se refere a aparência e o “Feel” se refere ao comportamento dos componentes. É como se fosse um skin, um tema, customizável ou não. O Java oferece algumas opções: CrossPlatformLookAndFeel (ou Metal), que parece o mesmo em qualquer plataforma; SystemLookAndFeel, que usa o L&F nativo do sistema utilizado; e Synth, que permite criar novos. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 51 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Pessoal, a principal função de uma interface gráfica de usuário é permitir interação entre usuários e aplicação. Os usuários interagem com uma aplicação clicando em botões, preenchendo caixas de texto, movimentando o mouse, entre outros. Essas ações dos usuários disparam eventos que são processados pela aplicação através de Event Listeners. Você pode descobrir quais tipos de eventos um componente pode disparar ao olhar seus tipos de Event Listeners! Para criar um Listener, devemos implementar a interface correspondente ao tipo de evento que queremos tratar. Por exemplo: KeyListener: utilizado quando se deseja tratar eventos de pressionar ou soltar teclas do teclado. MouseListener: utilizado quando se deseja tratar eventos como cliques dos botões do mouse (ex: duplo-clique, clique-arrasta, etc). WindowsEvent: utilizado quando se deseja tratar eventos que envolvem a manipulação de janelas. As tarefas de respostas realizadas em um evento são conhecidas como Handler de evento e o processo total de responder a eventos é conhecido como tratamento de evento. Para cada tipo de evento precisa ser implementada uma interface de escuta. Quando um evento acontece, é realizado o despacho (dispatching) para os ouvintes apropriados. Esse despacho chama um método de tratamento de evento em cada um de seus ouvintes, sendo registrados para o tipo de evento ocorrido. A ocorrência de um evento faz com que o componente receba um ID único de evento – ele especifica o tipo de evento. Então, o componente pega esse ID para decidir qual tipo de ouvinte será útil, decidindo qual o método que vai chamar para cada objeto listener. 16712855225
O evento é despachado por todas as decisões que são tratadas para o usuário através dos componentes GUI. Sendo necessário ser feito, pois precisa ser registrado um handler de evento para o tipo particular de evento que o aplicativo exige. O componente vai assegurar que o método apropriado do handler de evento é chamado quando o evento ocorrer. Pessoal, todo JComponent pode ter um ou mais bordas. As bordas são objetos inacreditavelmente úteis que, não sendo componentes, sabem como desenhar as Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 52 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
margens dos componentes. Elas são úteis não só para desenhar linhas e margens elegantes, mas também para fornecer títulos e espaços vazios em componentes. Para colocar uma borda em um JComponent, deve-se usar o método setBorder. Pode-se usar a classe BorderFactory para criar a maioria das bordas fornecidas. Se você precisar de uma referência para determinada uma borda, você pode salvá-la em uma variável do tipo Border, que conterá sua borda customizada. Abaixo podemos ver uma borda linear e, em seguida, vários outros tipos de bordas diferentes! Observem a diversidade disponível...
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 53 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: TIPOS ENUMERADOS
Trata-se de um tipo de dados especial que habilita uma variável a ser um conjunto pré-definido de constantes. A variável deve ser igual a um dos valores que foram predefinidos para ela. Exemplos comuns incluem direções de uma bússola ou os dias da semana. Por que? Porque são valores constantes! Ademais, lembrem-se que eles sempre vêm em letra maiúscula. A sintaxe básica inclui a palavra-reservada enum: public enum nomeENUM { <lista de constantes> }
Para especificar os dias da semana, as direções de uma bússola ou os planetas do sistema solar em um tipo enum, podemos fazer: public enum Dia { SEGUNDA, TERÇA, QUARTA, QUINTA, SEXTA, SÁBADO, DOMINGO; } public enum Bussola { NORTE, SUL, LESTE, OESTE; } public enum Planetas { MERCÚRIO, VENUS, TERRA, MARTE, JUPTER, SATURNO, URANO, NETUNO, PLUTÃO; }
Professor, qual é? O que tem demais em uma lista de constantes? Calma, amigão! Nós podemos adicionar alguns valores a essas constantes, mas para isso devemos primeiro declarar um construtor para, então, inicializar os atributos com os valores. Por exemplo, a distância para o sol em milhões de quilômetros! O construtor tem apenas um argumento porque a constante tem apenas um valor. Bacana? public class Main { 16712855225
public enum Planetas { MERCURIO(57), VENUS(108), TERRA(149), MARTE(227), JUPITER(778), SATURNO(1429), URANO(2870), NETUNO(4504), PLUTAO(5913); public int distanciaSol; Planetas(int distanciaSol) { this.distanciaSol = distanciaSol; } } public static void main(String[] args) { System.out.println("O Planeta mais afastado é: " + Planetas.PLUTAO); } }
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 54 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: ANOTAÇÕES
O Java 5 nos trouxe uma grande novidade que praticamente revolucionou o desenvolvimento de software! As Anotações permitem declarar metadados dos objetos nos próprios objetos e, não, em um arquivo separado. Dessa forma, configurações de uma classe poderiam permanecer dentro da própria classe, em vez de ficarem, por exemplo, em um Arquivo de Configuração XML. Professor, por que arquivos de configuração são tão detestáveis? Cara, porque muitas vezes eles tornam extremamente difíceis a compreensão de alguns sistemas. As anotações são mais simples, discretas, compreensíveis e podem efetivamente ajudar na automatização de algumas tarefas. Arquivos de Configuração são, algumas vezes, complexos, grandes, chatos e difíceis de entender. A Anotação, como o próprio nome diz, é uma forma de anotar, marcar, apontar classes, campos ou métodos, de tal maneira que essas marcações possam ser tratadas por um compilador, ferramentas de desenvolvimento e bibliotecas. Ela provê dados sobre um programa, mas não faz parte dele em si, isto é, elas não afetam diretamente a operação do código que elas anotam. Elas podem fornecer informações sobre o código que está sendo escrito ou até mesmo do próprio programa, semelhante a comentários. No entanto, elas podem ser utilizadas como um objeto semântico de compiladores, isto é, facilita bastante a vida dos compiladores. Dessa forma, eles podem entender que, por exemplo, não é para mostrar mensagens de advertências (os famosos warnings). Eles podem, inclusive, utilizar anotações para detectar erros de código; ou mesmo para criar documentações por meio de XML. Algumas anotações podem ser avaliadas em tempo de execução e podem possuir elementos ou não. Professor, qual é a sintaxe básica de uma anotação? As anotações são sempre precedidas de arroba (@). É absurdamente simples: 16712855225
@annotation
Por convenção, elas vêm antes do elemento que se deseja anotar (Ex: Antes do método ou classe). Abaixo temos uma lista com as anotações mais utilizadas: @Deprecated: indica que um método tem seu uso desencorajado por ser perigoso ou por ter uma alternativa melhor desenvolvida;
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 55 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
@Override: indica que um método da classe-pai será sobrescrito por um método da classe-filha; @SupressWarning(“unchecked”): indica que todos os avisos ou warnings da categoria “não verificado” devem ser ignorados; Existem mais de sessenta atualmente: @SafeVarargs, @FunctionalInterface, @Retention, @Documented, @Target, @Inherited, @Repeatable, @id. Anotações podem ser de três tipos: Anotações Marcadoras: são aquelas que não possuem membros; são identificadas apenas pelo nome, sem dados adicionais (Por exemplo: @id – não há valores ou dados adicionais). Anotações de Valor Único: são aquelas que possuem um único membro, o próprio valor; dessa forma, não é necessário informar o nome (Por exemplo: @SupressWarning(“unchecked”) é equivalente a @SupressWarning(value = “unchecked”)). Anotações Completas: são aquelas que possuem múltiplos membros; assim, deve-se usar a sintaxe completa para cada par nome/valor (Por exemplo: @Version(major = 1, minor = 0, micro = 0)). E que tal inventar sua própria anotação? Cara, é muito fácil e semelhante a interfaces! Tão parecido que se utiliza a mesma palavra, mas precedida de um @. Vejamos: <modificador> @interface identificador {
} 16712855225
Os modificadores e os elementos são opcionais! O identificador não pode ser o mesmo de uma classe ou interface utilizadas na aplicação. No código abaixo, criamos uma anotação que possui apenas um valor. Para chamá-la, basta utilizar o comando @MinhaAnnotation. É possível, inclusive, adicionar sua anotação personalizada no Javadoc. Bacana, né?! public @interface MinhaAnnotation { int valor() default 10; }
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 56 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: CLASSES INTERNAS (ANINHADAS)
Classes Aninhadas
Classes Estáticas
Classes Internas
Classes Locais
Classes Anônimas Java permite definir uma classe dentro de outra classe. Essa classe é conhecida como Classe Aninhada e é ilustrada acima! Elas se dividem em duas categorias: estáticas e não-estáticas. Classes Aninhadas que são declaradas com static são chamadas Classes Aninhadas Estáticas. Já as Classes Aninhadas Não-Estáticas são chamadas mais comumente de Classes Internas – como podemos ver abaixo: class ClasseExterna { ... static class ClasseAninhadaEstatica { ... } class ClasseInterna { ... } } 16712855225
Uma Classe Aninhada é um membro da Classe Externa. Classes Aninhadas NãoEstáticas (ou Classes Internas) possuem o aos membros da Classe Externa, mesmo que eles sejam declarados como private. Classes Aninhadas Estáticas não possuem o aos membros da Classe Externa e podem ser declaradas como private, public, protected ou default (sem modificador). As Classes Externas só podem ser declaradas como public ou default. Aí vocês devem estar se perguntando: por que usar classes aninhadas? Cara, é uma maneira de agrupar logicamente classes que são utilizadas em apenas um lugar. Se você possui
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 57 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
uma Classe B que com certeza será usada apenas dentro da Classe A, o melhor é criar a Classe B como interna a Classe A. Além disso, ela aumenta o encapsulamento. Imaginem que A e B são classes normais (não-aninhadas, também chamadas top-level) e a Classe B precisa ar os membros da Classe A. Podemos, então, colocar a Classe B dentro da Classe A e colocar os membros de A como privados. Ainda assim, a Classe B poderia ar os membros da Classe A por ser uma classe aninhada. Por fim, ela pode levar a códigos mais legíveis e fáceis de dar manutenção! Colocar classes pequenas dentro de classes não-aninhadas, já que apenas essa a utilizará, faz com que a lógica da classe não-aninhada seja mais fácil de ser identificada, consequentemente tornando o código mais legível e de fácil manutenção. Essas são apenas algumas das vantagens de se utilizar classes aninhadas. Bem como métodos e variáveis de classe, uma classe aninhada estática é associada à sua classe exterior. E assim como métodos de classes estáticas, uma classe aninhada estática não pode se referir diretamente a variáveis ou métodos de instância definidos na Classe Exterior. Elas são adas utilizando o nome da classe externa: ClasseExterna.ClasseAninhadaEstatica. Vamos falar um pouco sobre as Classes Internas! Da mesma forma que métodos e variáveis de instância, uma classe interna é associada a uma instância de sua classe externa e tem o direto a métodos e campos desse objeto. Além disso, como uma classe interna é associada a uma instância, ela não pode definir nenhum membro estático. Objetos que são instâncias de uma classe interna existem dentro da instância de uma classe externa. Entenderam isso? Uma instância da classe interna só pode existir dentro de uma instância da classe externa, e tem o direto aos métodos e campos de sua instância externa. Para instanciar uma classe interna, deve-se primeiro instanciar a classe externa, como segue: 16712855225
ClasseExterna.ClasseInterna objetoInterno = objetoExterno.new ClasseInterna();
As classes internas se dividem em classes locais e anônimas! As primeiras são classes definidas em um bloco (grupo de zero ou mais declarações entre chaves). Em geral, classes locais são encontradas no corpo de um método. As segundas permitem escrever códigos mais concisos, e declarar e instanciar uma classe ao mesmo tempo. São comuns quando se deseja usar uma classe local apenas uma vez.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 58 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: REFLEXÃO E GENÉRICOS
Reflexão (ou Reflection) é comumente utilizada por programas que requerem a habilidade de examinar ou modificar o comportamento em tempo de execução de aplicações que rodam em uma Java Virtual Machine (JVM). Em geral, é um recurso bastante avançado e extremamente poderoso, e deve ser utilizado apenas por programadores experientes. Reflection pode permitir que aplicações executem operações que, por muito tempo, se pensou impossível. Ele permite criar chamadas em tempo de execução, sem precisar conhecer as classes e objetos envolvidos quando escrevemos nosso código. Esse dinamismo é necessário para resolvermos tarefas que nosso programa só descobre serem necessárias ao receber dados, em tempo de execução. Essa tecnologia possibilita listar todos os atributos de uma classe e pegar seus valores em um objeto; instanciar classes cujo nome só vamos conhecer em tempo de execução; invocar métodos dinamicamente baseado no nome do método como String; descobrir se determinados pedaços do código têm annotations. É um recurso muito poderoso! Já o Generics permite que você personalize um método ou uma classe genérica para qualquer tipo que você esteja trabalhando. Para ter certeza da tipagem dos objetos em tempo de compilação, devemos aplicar o recurso do Generics. Com este recurso podemos determinar o tipo de objeto que queremos armazenar em uma coleção no momento em que ela é criada. A partir daí, o compilador não permitirá que elementos não compatíveis com o tip escolhido sejam adicionados na coleção. Isso garante o tipo do elemento no momento em que ele é recuperado da coleção e elimina a necessidade de casting. Imaginem que bacana seria poder escrever um único método de ordenação de elementos de um vetor. 16712855225
Mas não só isso, esse método seria capaz de ordenar tanto um vetor de inteiros como um vetor de String, ou qualquer outro tipo. Nossa tecnologia permite que programadores especifiquem, com uma simples declaração de método, um conjunto de métodos relacionados; ou, com uma simples declaração de classes, um conjunto relacionado de tipos respectivamente.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 59 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: TRATAMENTO DE EXCEÇÕES
Em programação, há sempre a possibilidade de ocorrer erros imprevistos durante a execução de um sofware, esses erros são exceções e podem ser provenientes de erros de lógica, o a dispositivos ou arquivos inexistentes, edição de algo sem permissão, etc. Na Linguagem C, códigos de erro são utilizados para indicar o tipo de erro que ocorreu! Como assim, professor? Vejamos o exemplo abaixo: int testeErro(int idade) { if(idade >= 0) idade = idade + 18; else return 100; //Código de Erro para valor negativo }
Observem que se a idade informada for maior ou igual a zero, realiza-se uma determinada operação; se for menor que zero (negativa), retorna-se o Código de Erro 100 – para que o programador saiba o que ocorreu. Qual o problema dessa abordagem? Primeiro, exige uma vasta documentação indicando o que significa cada código de erro (Ex: 100 = Valores negativos; 200 = Sem permissão de escrita). Além disso, observe que a palavra-reservada return fica ocupada, impossibilitando a devolução de outros possíveis resultados. Entenderam essa parte? Eu poderia usar essa palavra para retornar valores importantes para o código, mas não posso porque ele está ocupado em informar se houve ou não erro. Pois é, o Java possui uma estratégia diferente para contornar esses imprevistos.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 60 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Ele busca realizar o tratamento dos locais do código que podem vir a lançar possíveis exceções. Java possui a classe Throwable, que modela todos os tipos de erros de execução e que se divide em duas subclasses Error e Exception. A primeira define erros que não devem ser capturados pelas aplicações, pois representam erros graves que não permitem que a execução continue de maneira satisfatória3.
A segunda define erros para os quais as aplicações normalmente têm condições de realizar um tratamento, logo Exception Error são subtipos de Throwable. As exceções ainda se dividem em verificadas (Checked), quando obrigatoriamente devem ser tratadas e não-verificadas (Unchecked), quando não há essa obrigação – programador decide! E como se detectam, manipulam e tratam as exceções? 16712855225
Bem, sempre que um método de alguma classe for ível de causar algum erro previsto, nós podemos utilizar um método de tentativa chamado try. Tudo que estiver dentro do bloco try será executado até que alguma exceção seja lançada, ou seja, até que algo dê errado. Quando uma exceção é lançada, ela sempre deve ser capturada. O trabalho de captura da exceção é executado pelo bloco catch.
3
Exemplo: estouro de memória.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 61 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Podemos encadear vários blocos catch, dependendo do número de exceções que podem ser lançadas por uma classe ou método. O bloco catch obtém o erro criando uma instância da exceção. Quando uma exceção é lançada e é necessário que determinada ação seja tomada mesmo após a sua captura, utilizamos a palavra reservada finally – é opcional, mas se existir, sempre será executado. É útil para liberar recursos do sistema quando utilizamos, por exemplo, conexões de banco de dados e abertura de buffer para leitura ou escrita de arquivos. finally virá após os blocos de catch. Portanto, o try indica que um bloco de código pode ocorrer erro; o catch tem o objetivo de capturar, manipula e trata erros; e o finally busca realizar ações mesmo após a captura de erros. Vejamos a estrutura básica: try { //Não vem sozinho: try/catch, try/finally ou try/catch/finally //Código a ser executado } catch (ClasseDeExceção objDaExceção) { //Não vem sozinho: try/catch ou try/catch/finally //Tratamento da exceção } finally { //Não vem sozinho: try/finally ou try/catch/finally. //Código a ser executado mesmo que uma exceção seja lançada }
Algumas observações importantes: o catch deve aparecer após o try e entre os blocos não deve haver nenhuma outra instrução. Além disso, quando uma exceção é identificada no try, o restante do código não é executado e não há um retorno para o término do código. Implicitamente, todas as classes Java automaticamente lançam uma exceção de RuntimeException. Por fim, vamos falar da propagação de exceções! Imagine uma situação em que não é desejado que uma exceção seja tratada na própria classe ou método, mas sim em outra classe ou método que venha lhe chamar. Para solucionar tal situação utilizamos o a cláusula throws na do método indicando explicitamente a possível exceção que o mesmo poderá a vir lançar. Sintaxe abaixo: 16712855225
tipoDeRetorno nomeDoMetodo(...) throws tipoExcecao1, tipoExcecao2, tipoExcecaoN
Em outras palavras, utilizamos throws para indicar que qualquer um que chame aquele método deve tratar suas possíveis exceções. No entanto, algumas vezes podemos fazer com que um método lance um throwable (em geral, do tipo exceção) sem exigir que aqueles que chamem esse método tratem essa exceção – para tal, utilizamos throw. Sintaxe abaixo: throw new Exception("Número não pode ser negativo!");
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 62 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Observem que a palavra-reservada throw é utilizada dentro do corpo do método para invocar uma exceção qualquer personalizada explicitamente, além de não poder lançar mais de uma exceção; já a cláusula throws é utilizada na declaração ou de um método e declaração uma exceção a ser tratada, além de poder lançar mais de uma exceção.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 63 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: SINCRONISMO E MULTITHREADING
Vocês já devem ter percebido que os programas que utilizamos corriqueiramente conseguem executar diversas atividades relativamente independentes entre si. Você está lá navegando em dezessete abas diferentes pelo Firefox e ao mesmo tempo está baixando algum arquivo, ouvindo alguma música, lendo a minha aula e enviando um e-mail – tudo paralelamente. E aqueles sistemas que você utiliza no seu trabalho em que várias pessoas am para fazer coisas diferentes? Pois é, já que essas atividades são relativamente independentes entre si, elas podem ser executadas em paralelo. Vocês concordam comigo? Na verdade, a maioria dos softwares realizam diversas tarefas paralelamente sem nós percebermos! Quando nós executamos essas tarefas em paralelo, estamos usando Threads! Vocês sabem o que essa palavra significa em português? Fios ou Linhas! Em outras palavras, criamos linhas de execução de tarefas paralelas em memória – cada linha responsável por executar alguma coisa simultaneamente e relativamente independentes. Em Java, as Threads são objetos presentes no Pacote java.lang. Além da vantagem evidente de poder realizar tarefas simultaneamente, podemos dizer que assim utilizamos os recursos disponíveis de melhor forma, especialmente quando o computador em questão possui múltiplos processadores. Para entender isso melhor, podemos observar o ciclo de vida de threads e cada estágio pelo qual ela a – do início ao fim!
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 64 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
New: uma nova thread começa seu ciclo de vida no estado new e permanece nele até o programa inicializar a thread – é como se ela tivesse nascido. Runnable: após uma nova thread ter sido inicializada, a thread se torna runnable – é nesse estado que ela executa uma tarefa. Waiting: algumas vezes, uma thread espera outra thread realizar alguma tarefa até que esse thread sinalize que ela pode continuar sua execução. Timed Waiting: é o mesmo caso que o anterior, no entanto aqui o intervalo de tempo de espera é especificado. Terminated: uma thread runnable entra nesse estado quando completa sua tarefa ou quando termina. Dissemos várias vezes que, em geral, threads são relativamente independentes. Nós dissemos dessa maneira, porque quando elas utilizam recursos em comum, é preciso haver um sincronismo. Quando muitas threads são executadas, é necessário sincronizar suas atividades para prevenir, por exemplo, o o concorrente a estruturas de dados no programa que são compartilhadas entre as threads. É imprescindível entender que um aplicativo possui uma área de disputa de memória compartilhada entre todas as threads, chamada Região Critica. Para que uma aplicação se torne confiável, ela terá que garantir que somente uma thread utilizará a Região Crítica por vez e o programador deve perceber quando mais de uma thread modifica uma determinada área de memória em comum. Não é necessária a sincronização quando os valores da memória compartilhada não são modificados, ou seja, caso as threads só comparem ou tomem qualquer outro tipo de decisão que não venha a modificar os dados da memória compartilhada entre as threads. Para quem estudou um pouco de sincronismo de banco de dados, é mais fácil entender o sincronismo em java. 16712855225
Para entender a utilização de threads programaticamente, podemos utilizar um exemplo! Sabe quando você quer gerar um arquivo em PDF e, enquanto ele está sendo gerado, aparece uma barrinha de que vai enchendo à medida que o arquivo vai se concluindo? Pois é, esses processos paralelos e simultâneos podem ser executados por meio de threads! Vamos pensar... public class GeraPDF implements Runnable { public void run () {
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 65 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 // Código para gerar PDF. } } public class BarraDeProgresso implements Runnable { public void run () { // Código da barra de progresso. } } public class MeuPrograma { public static void main (String[] args) { GeraPDF gerapdf = new GeraPDF(); Thread threadDoPdf = new Thread(gerapdf); threadDoPdf.start(); BarraDeProgresso barraDeProgresso = new BarraDeProgresso(); Thread threadDaBarra = new Thread(barraDeProgresso); threadDaBarra.start(); } }
O código acima começa com duas classes – GeraPDF, que evidentemente gera o PDF; e BarraDeProgresso, que obviamente cria a barra de progresso! Observem que ambas implementam a interface Runnable – isso é necessário para que as instâncias dessa classe sejam executadas por uma thread. Aliás, essa interface possui um único método (run()), que cria a thread e a executa. No método main, criamos os objetos de cada classe e amos para a classe thread. Como assim, professor? Observem que primeiro geramos um objeto (gerapdf), em seguida criamos uma thread com esse objeto (new Thread(gerapdf)) e depois chamamos o método start(), responsável por chamar o método run() da classe específica – sem isso, não seria possível saber qual método run() deveria ser chamado.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 66 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: COLEÇÕES
Coleção é qualquer agregado de referências a objetos (elementos) em alguma estrutura de dados. As coleções são sempre de um mesmo tipo de elementos. Por exemplo, podemos ter uma coleção de Datas, uma coleção de Pessoas, ou uma coleção de Alunos. Em Java, os elementos de uma coleção devem ser sempre referências a objetos, não podendo ser tipos primitivos, como int e char. Mas essa limitação na prática não existe, porque a cada tipo primitivo corresponde uma classe, como as classes Integer e Character. Por exemplo, para cada valor de int pode ser construído um objeto da classe Integer, que tem esse valor na sua única variável de instância. Podemos então ter coleções de Integer, de Double, de Character. Bacana? Quando falamos em tipo dos elementos de uma coleção, estamos falando, portanto, do tipo das referências que podem ser armazenadas na coleção. Para facilitar, na prática usamos comumente expressões como "coleção de objetos" como uma forma abreviada de dizer "coleção de referências a objetos". Da mesma forma, dizemos, "coleção de Alunos" para "coleção de referências do tipo Aluno". É um erro conceitual comum pensar que uma coleção de objetos armazena esses objetos dentro dela. O conceito de coleção é bem genérico, e significa qualquer agrupamento de objetos. Existem conceitos mais específicos para representar coleções com propriedades estruturais particulares. O mais simples é o conceito de uma lista. Outras formas conceituais são as ideias de conjunto, árvore, grafo, etc. Vamos começar falando das Listas (java.util.List)! Ela se caracteriza por ser sequencial, com cada elemento ocupando uma posição relativa, indexada de 0 até N-1, onde N é a quantidade de elementos. Em uma lista, faz sentido falar em primeiro, segundo, terceiro elemento. Não há restrição em se colocar uma mesma referência em mai de uma posição da lista (i.e., a lista pode ter elementos duplicados). 16712855225
Galera, não sei se algum de vocês já programou em C! Se sim, vocês se lembram de como era complicado utilizar ponteiros, ponteiros para ponteiros, alocação dinâmica de memória? Pois é, Java não exige que você faça nada disso! As coisas aqui são muito mais simples e já existe bastante funcionalidade implementada e pronta para ser utilizada. As principais classes implementadoras são: ArrayList, LinkedList, Vector. ArrayList arrayList = new ArrayList(); LinkedList linkedList = new LinkedList(); Vector vector = new Vector();
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 67 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 //Observem que eu posso referenciar os objetos criados como List (Lista). List list = new ArrayList(); List list = new LinkedList(); List list = new Vector();
MÉTODO
DESCRIÇÃO
add(Object)
Adiciona uma referência no final da lista e aceita referências de qualquer tipo; add(int, Object) Adiciona uma referência em uma determinada posição da lista; size()
Informa a quantidade de elementos armazenado na lista;
clear()
Remove todos os elementos da lista;
contains(Object): Verifica se um elemento está contido em uma lista; remove(Object): Retira a primeira ocorrência de um elemento de uma lista; remove(int): get(int):
Retira elementos pela sua posição na lista; Recupera um elemento de uma determinada posição da lista;
indexOf(Object): Descobre o índice da primeira ocorrência de um elemento;
Agora vamos falar um pouco sobre Conjuntos (java.util.Set). Trata-se de outra categoria de coleção, em que não há noção de posição relativa (primeiro, segundo, etc) e que não podem existir elementos duplicados. Um exemplo simples é o conjunto de países que estão na Comunidade Europeia. Não há interesse em se repetir países, e não há ordem relativa (um país não está antes ou depois de outro). 16712855225
Como os conjuntos não possuem ordem, as operações baseadas em índice que existem nas listas não aparecem nos conjuntos. Set é a interface Java que define os métodos que um conjunto deve implementar. As principais classes implementadoras são: HashSet, TreeSet e LinkedHashSet. Cada implementação possui suas características sendo apropriadas para contextos diferentes.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 68 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Galera, sendo bem sincero, não vejo grandes vantagens no uso de sets. Tudo bem, algumas vezes, eles possuem performance melhor que a das listas, mas não é nada demais. O que eu acho importante é saber essas características básicas e diferentes para outros tipos de coleções. Vamos ver agora um exemplo e algumas das suas principais operações e suas descrições. HashSet hashSet = new HashSet(); TreeSet treeSet = new TreeSet(); LinkedHashSet linkedHashSet = new LinkedHashSet(); //Observem que eu posso referenciar os objetos criados como Set (Conjunto). Set set = new HashSet(); Set set = new TreeSet(); Set set = new LinkedHashSet();
MÉTODO size() isEmpty
DESCRIÇÃO Retorna a quantidade de elementos armazenados no conjunto; Verifica se o conjunto está vazio;
add()
Adiciona um elemento específico ao conjunto;
remove()
Remove um elemento específico do conjunto;
Agora vamos ver Filas (java.util.Queue). Trata-se de outra categoria de coleção, semelhante a filas, em que o primeiro elemento a entrar será o primeiro elemento a sair (FIFO). Basta lembrar da fila de um supermercado. A primeira pessoa que entrou na fila será a primeira pessoa a sair da fila. Aliás, ela possui operações de inserção, remoção e inspeção. 16712855225
Galera, percebam que uma fila é uma lista, porém com um objetivo diferente! A fila é desenhada para ter elementos inseridos no final da fila e removidos no início da fila. As principais classes implementadoras da interface Set são: PriorityQueue e LikedList. Cada implementação possui suas características sendo apropriadas para contextos diferentes. LinkedList linkedList = new LinkedList(); PriorityQueue priorityQueued = new PriorityQueue(); //Observem que eu posso referenciar os objetos criados como Queue (Fila).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 69 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 Queue queue = new LinkedList(); Queue queue = new PriorityQueue();
MÉTODO add() remove() element()
DESCRIÇÃO Insere um elemento na fila; Remove um elemento da fila; Retorna o primeiro elemento da fila;
Por fim, vamos falar sobre os Mapas (java.util.Map). Aqui já começamos diferente, porque mapas não são coleções. Pensem comigo: muitas vezes queremos buscar rapidamente um objeto, dada alguma informação sobre ele (Ex: dada a placa do carro, obter todos os dados). Poderíamos utilizar uma lista e percorrer todos os elementos, mas isso é péssimo para a performance – aqui entra o mapa! Um mapa é composto por um conjunto de associações entre um objeto chave a um objeto valor. É equivalente ao conceito de dicionário, utilizado em várias linguagens. Algumas linguagens, como Perl ou PHP, possuem um e mais direto a mapas, onde são conhecidos como matrizes ou arrays associativos. O objetivo é mapear uma chave a um valor. Em um dicionário eu associo um vocábulo a uma definição. A chave é um objeto utilizado para recuperar um valor. O mapa costuma aparecer junto com outras coleções, para poder realizar essas buscas. As principais classes implementadoras da interface Map são: HashMap, TreeMap e LinkedHashMap. Cada implementação possui suas características sendo apropriadas para contextos diferentes.
16712855225
MÉTODO clear() containsKey(k) containsValue(v) entrySet() equals() get() remove(k)
DESCRIÇÃO Remove todos os pares chave/valor do mapa; Retorna true se o mapa invocador contiver o objeto k como chave; Retorna true se o mapa contiver o objeto v como chave; Retorna um conjunto que contenha as entradas no mapa; Retorna true se mapas contiverem as mesmas entradas; Retorna o valor associado com a chave k; Remove a entrada que tiver chave igual a k;
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 70 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: STREAMS E SERIALIZAÇÃO
O que é Stream? Vamos ver um exemplo bacana: sabem quando vocês veem um jogo de futebol ao vivo pela internet? Ou quando vocês assistem ao julgamento de um réu pelo website do Supremo Tribunal Federal? Pois é, isso é streaming! Em outras palavras, trata-se de um fluxo de dados contínuo (nesse caso, vídeo) transmitido de uma fonte de dados para um destino específico. Em Java, quando dizemos que um objeto é serializado, estamos querendo dizer que ele será transformado em bytes, e poderá ser armazenado em disco ou transmitido por um stream. Um stream é um objeto de transmissão de dados, em que um fluxo de dados serial é feito através de uma origem e de um destino. Os tipos mais comuns de stream são o FileOutputStream e o FileInputStream. Ambos os streams são utilizados para manipular objetos serializados. O primeiro é um fluxo de arquivo que permite a gravação em disco; o segundo é um fluxo de arquivo que permite a leitura em disco – ou seja, o inverso! Galera, em suma, a serialização serve para salvar, gravar e capturar o estado de um objeto. Assim, posso criar um objeto, gravá-lo em um arquivo e futuramente utilizá-lo. A serialização permite que eu transforme uma instância de um objeto em uma sequência bytes. É bacana porque, nesse formato, eu posso enviá-lo pela rede, salvar no disco ou comunicar uma JVM com outra. Eu congelo o estado atual de um objeto e, lá no destino, descongela-se esse estado sem perda de dados. O exemplo que eu costumo usar é jogo de videogame! Sabe quando você já está lá quase zerando o jogo? E se você desligar o videogame e perder tudo? Pois é, é útil salvar o estado atual! Como faço isso? Você deve implementar a interface Serializable do pacote java.io.Serializable. O que tem nessa interface, professor? Nada, mas ela indica para a JVM que você deseja que determinada classe esteja habilitada para ser serializada. Não encontrei questões! 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 71 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 JAVA: CLASSES E OPERAÇÕES DE I/O
Professor, o que é I/O? É uma sigla para Input/Output! Em português, seria E/S – ou Entrada/Saída! Isso indica a comunicação entre sistemas de processamento de dados (Ex: Computador) e o mundo externo (Ex: Humano). Entradas são dados recebidos pelo sistema e Saídas são dados enviados pelo sistema. A melhor maneira de entender isso é por meio de um exemplo! Uma operação de entrada de dados seria aquele dado lido de uma base de dados (Ex: read() – lê dados da entrada padrão do sistema). Já uma operação de saída de dados seria aquele dado escrito em uma base de dados (Ex: write() – escreve dados na saída padrão do sistema). Agora que vocês já sabem o que são operações de Entrada/Saída, podemos prosseguir! O Java é capaz de processar arquivos que requisitam grandes quantidades de dados persistentes. O que é isso, professor? São aqueles dados armazenados dentro de arquivos – fala-se persistente porque ele dura além da finalização de um programa. Esse processamento de arquivos é uma capacidade que a linguagem oferece para ler e gravar dados! Bacana? Pessoal, se vocês quiserem trabalhar com entrada e saída de dados em nossa linguagem, recomenda-se utilizar classes que estão dentro do pacote java.io. Por que? Porque lá vocês encontrarão classes que oferecem funcionalidades como manipulação de entrada/saída de bytes, manipulação de entrada/saída de caracteres, buffers de leitura e escrita, conversão de formatos, entre outros. As classes abstratas InputStream OutputStream definem, respectivamente, o comportamento padrão dos fluxos de entrada (para ler bytes) e dos fluxos de saída (para escrever bytes). Em outras palavras, essas duas classes abstratas permitem manipular a entrada e a saída de dados como uma sequência de bytes, sejam um arquivo, um BLOB de uma base de dados, uma conexão remota via sockets, etc. 16712855225
Vamos falar um pouco sobre a Classe InputStream! Ela oferece a funcionalidade básica de leitura de um byte ou de uma sequência de bytes a partir de alguma fonte. Podemos utilizar o método read() – o valor de retorno desse método é um inteiro, que pode ser o byte lido do próprio método ou número de bytes lidos – quando o retorno for igual a -1, é informado que o final do arquivo foi atingindo. InputStream is = new FileInputStream("arquivo.txt"); int valor = is.read();
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 72 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Observem no exemplo acima que a classe abstrata InputStream foi declarada inicializando uma classe dependente FileInputStream. Essa classe recebe uma String como argumento do seu método construtor – ele representa a definição de onde está localizado o arquivo. Entendido? Podemos ver abaixo a hierarquia das classes que dependentes da Classe InputStream:
Abaixo podemos ver uma pequena descrição das principais classes:
Classe Descrição ByteArrayInputStream Valores são originários de um arranjo de bytes. FileInputStream FilterInputStream
Bytes com originalidade de um arquivo. Filtra os dados de um InputStream.
BufferedInputStream Faz a leitura de grandes volumes de bytes que armazena em um buffer interno. Permite a leitura de representações binárias dos tipos primitivos DataInputStream de Java. ObjectInputStream Oferece o método readObject para a leitura de objetos que foram serializados para um ObjectOutputStream. Faz a leitura de um pipe de bytes cuja origem está associada a um PipedInputStream objeto PipedOutputStream. 16712855225
Já a Classe OutputStream é responsável por transferir os bytes para algum destino. método write() tem a função de escrever em forma de bytes para o destino em que enviará os dados. Que destino é esse? Bem, isso não importa! Quando o sistema Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 73 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
precisar escrever em uma saída, basta ele chamar o método que utiliza a classe abstrata, visto que ele aceita qualquer dependente de OutputStream. Observem um exemplo abaixo: File arquivo = new File("Teste.txt"); FileWriter fw = new FileWriter(arquivo); fw.write("25"); fw.flush();
Abaixo podemos ver uma pequena descrição das principais classes:
Classe FileOutputStream FilterOutputStream PipedOutputStream
Descrição Escreve em um arquivo ou em um descritor de arquivo. Filtra saídas, transformando dados ou provendo funcionalidades adicionais. Cria comunicações pipe ao se conectar com entradas pipe.
ByteArrayOutputStream Implementa uma saída na qual dados são escritos em um array de bytes. ObjectOutputStream Escreve tipos de dados primitivos. 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 74 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 NOVIDADES: JAVA 8
Pessoal, vocês já devem saber que nós temos uma nova versão! A cobrança ainda é raríssima (só encontrei uma questão), mas é bom saber um pouco sobre as principais novidades. A grande novidade foram as Lambda Expressions! Pois é, Java agora tem algumas características de programação funcional. Professor, o que é exatamente programação funcional? É um paradigma de programação que trata a computação como uma avaliação de funções matemáticas e que evita estados ou dados mutáveis. Ela enfatiza a aplicação de funções, em contraste com a programação imperativa, que enfatiza mudanças no estado do programa. As Lambda Expressions permitem ar comportamentos, ou funções como argumentos em uma chamada de método. Para entendê-las, é necessário conhecer os conceitos de funções de primeira classe e literais. Tradicionalmente no Java, um método (função, procedimento) somente existe como membro de uma classe. Isso significa que, embora você possa ter uma variável "apontando" para um objeto, você não pode guardar um método numa variável. Bacana, pessoal? Tudo aquilo que é permitido referenciar numa linguagem (no caso, objetos ou tipos primitivos), ar como parâmetro para outras funções, etc, é dito ser "de primeira classe". Outras linguagens, entretanto, permitem que funções e outras coisas mais (como classes) sejam referenciados e ados como argumento. No JavaScript, por exemplo, é bastante comum ar uma função para uma variável. O e a funções de primeira classe simplifica em muito a construção de certas funções. Aliás, elas vão um o além, não só permitindo ar funções como parâmetro para outras funções, mas também permitindo que as mesmas sejam expressas como literais. Professor, o que é um literal? Um literal é uma notação que representa um valor fixo no código fonte. 16712855225
Em outras palavras, através do uso da própria sintaxe você consegue criar um objeto que de outra forma exigiria a combinação de duas ou mais funcionalidades diferentes. No Java 8, o literal para uma expressão lambda consiste em uma lista de argumentos (zero ou mais) seguida do operador -> seguida de uma expressão que deve produzir um valor. Exemplos: () -> 42 x -> x*x (x,y) -> x + y
Prof. Diego Carvalho
// Não recebe nada e sempre retorna "42" // Recebe algo e retorna seu quadrado // Recebe dois valores e retorna sua soma
www.estrategiaconcursos.com.br
Pág. 75 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Em suma, as expressões lambda busca concisão no código, i.e., fazer mais escrevendo menos. Com frequência, não há razão para se exigir que uma função esteja sempre acompanhada de uma classe, e o uso dessas expressões evita muitas construções desnecessárias. Evita-se criar classes anônimas com apenas um método para solucionar algum problema. Quem se interessar mais: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#use-case
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 76 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(CESPE - 2013 - SERPRO - Analista - Desenvolvimento de Sistemas Garbage Collector é a tecnologia que gerencia a memória alocada para o programa, a fim de liberar objetos que não estão sendo utilizados. Comentários: O o a arrays e strings, e a conversão de tipos são checados em tempo de execução para assegurar a sua validade. O Garbage Collector faz a desalocação automática de memória evitando, erros de referência e desperdício de memória. Finalmente, o recurso de Exception Handling permite o tratamento de erros em tempo de execução, por um mecanismo robusto, análogo ao do C++. Conforme vimos em aula, essa é a função precípua do Garbage Collector! Gabarito: C (CESPE - 2012 - TRE-RJ - Técnico Judiciário - Programação de Sistemas A linguagem de programação Java é muito utilizada por ter como característica gerar um código independente de plataforma que pode ser executado em qualquer arquitetura e sistema operacional que tenha o sistema Java. Comentários: Vocês sabiam que Java é uma Linguagem WORA? Pois é, esse acrônimo significa Write Once, Run Anywhere ou Escreva uma vez, execute em qualquer lugar. Tratase de um slogan para exemplificar os benefícios multiplataforma da linguagem Java! Idealmente, isso significa que um programa em Java (uma vez compilado em um bytecode) pode rodar em qualquer equipamento que possua uma JVM! 16712855225
Conforme vimos em aula, seria mais correto dizer Java Virtual Machine (JVM) e, não, Sistema Java. No entanto, a questão está correta. Gabarito: C (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas No Java, a JRE possui tudo que é necessário para desenvolver programas em Java. Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 77 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Portanto, é o seguinte: se você deseja somente executar alguma aplicação Java no seu computador ou navegador, basta instalar um JRE! No entanto, se você planeja programar em Java, você precisará de um JDK (que contém a JRE)! Entenderam? É bastante simples! JRE é o mínimo que você precisa para rodar uma aplicação e o JDK é o que você precisa para desenvolver uma aplicação! Conforme vimos em aula, ela possui tudo que é necessário para executar programas em Java. Para desenvolver programas, seria necessária uma JDK! Gabarito: E (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas Em Java, para toda classe, método e variável de instância que se declara há um controle de o, independentemente de o controle ser explicitamente indicado. Comentários:
Especificador Private (-)
(~) Protegido (#) Público (+)
Própria Classe Sim Sim Sim Sim
Subclasse Não Não* Sim Sim
Pacote Não Sim Sim Sim
Global Não Não Não Sim
Conforme vimos em aula, está perfeito! Por que ele diz “independentemente de o controle ser explicitamente indicado”? Porque quando não se indica o modificador de o, assume-se que é Pacote ou Default. 16712855225
Gabarito: C (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas O operador instanceof só pode ser usado para testar valores null. Comentários:
Palavras
Descrição Testa se um objeto é uma instância de uma classe específica ou se é null.
Instanceof Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 78 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Conforme vimos em aula, ele também pode ser utilizado para testar se um objeto é instância de uma classe específica. Gabarito: E (CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6 Em Java, qualquer método de uma classe pode ser sobrescrito por métodos de outra classe. Comentários: //Indica que esse método não possui corpo abstract int soma (int a, int b) {//...//} //Indica que esse método não pode ser sobrescrito final int soma (int a, int b) {//...//} //Indica que esse método só pode ar atributos de classe e não pode ser sobrescrito static int soma (int a, int b) {//...//} //Indica que esse método foi escrito outra linguagem native int soma (int a, int b) {//...//} //Indica que esse método só é executável por uma thread por vez synchronized soma (int a, int b) {//...//}
Não, métodos finais, estáticos e privados não podem ser sobrescritos por métodos de outra classe. Gabarito: E (CESPE - 2011 - -ES - Técnico de Informática - Específicos) O JVM (Java Virtual Machine) é um interpretador que atribui portabilidade à linguagem Java, possibilitando, consequentemente, a sua execução em qualquer sistema operacional. 16712855225
Comentários: Java é também uma linguagem portável e multiplataforma! O Compilador é capaz de gerar um código intermediário (bytecode), que permite que o mesmo programa possa ser executado em qualquer máquina ou sistema operacional que possua uma JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado). Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 79 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Perfeito, desde que haja uma Java Virtual Machine (JVM) específica para esse Sistema Operacional. Portanto, a questão está incompleta, mas não é bom brigar com a banca. Gabarito: C (CESPE - 2011 - TRE-ES - Técnico - Programação de Sistemas – Específicos O encapsulamento em Java somente pode ser realizado por meio do modificador de o protegido. Comentários:
Especificador Private (-)
(~) Protegido (#) Público (+)
Própria Classe Sim Sim Sim Sim
Subclasse Não Não* Sim Sim
Pacote Não Sim Sim Sim
Global Não Não Não Sim
Não, pode ser Público, Privado, Protegido ou Padrão. Gabarito: E (CESPE - 2010 - TRT - 21ª Região (RN) - Técnico Judiciário - Tecnologia da Informação A linguagem de programação Java, em razão de sua portabilidade — uma vez que o compilador Java converte o código fonte em bytecodes, executados por uma máquina virtual — é bastante utilizada para oferecer conteúdos dinâmicos na Web. 16712855225
Comentários: O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um programa que carrega e executa os aplicativos Java, convertendo bytecodes em código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é, isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java. Conforme vimos em aula, está perfeito! Para tal, utiliza-se o Java EE.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 80 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Gabarito: C 10. (CESPE - 2010 - TRE-BA - Técnico Judiciário - Programação de Sistemas Em programação orientada a objetos, o pacote tem como função agrupar classes dentro de um grupo. Em Java, o pacote Swing (javax.swing) é composto de várias classes para a implementação de interfaces gráficas em desktop. Comentários: A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes e interfaces que definem os componentes visuais necessários para construir uma interface gráfica de usuário. Conforme vimos em aula, a questão está correta! Gabarito: C 11. (CESPE - ANAC - Analista istrativo - Tecnologia da Informação Pelo uso de polimorfismo, uma chamada de método pode fazer que diferentes ações ocorram, dependendo do tipo do objeto que recebe a chamada. Comentários: A palavra Polimorfismo vem do grego: muitas formas. Trata-se da capacidade de um objeto poder se comportar de diversas formas dependendo da mensagem recebida Observem que isso não quer dizer que o objeto fica transformando seu tipo a todo momento. Na verdade, um objeto nasce com um tipo e morre com esse mesmo tipo. O que muda, então? É a forma como nós nos referimos a esse objeto! 16712855225
Conforme vimos em aula, dependendo do tipo de objeto (se é da Classe-Pai ou da Classe-Filho), ações diferentes podem ocorrer. Gabarito: C 12. (CESPE - 2010 - EMBASA - Analista de Saneamento - Analista de Tecnologia da Informação - Desenvolvimento O trecho de código a seguir está incorreto porque uma variável booleana em Java usa a sintaxe == e não =.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 81 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Public void disconnect() { Connected = false; } Comentários:
ARITMÉTICOS + * / %
ATRIBUIÇÃO = += -= *= /= %= ++ --
RELACIONAIS > < >= <= != == ? instanceof
LÓGICOS ! && ||
BIT A BIT & | ^ << >> >>>
Conforme vimos em aula, o operador de atribuição (=) é diferente do operador relacional (==). Gabarito: E 13. (CESPE - TRE-MA - Técnico Judiciário - Programação de Sistemas) Para definição e manipulação de uma exceção em Java, devem constar no programa, obrigatoriamente, os termos: a) try e catch. b) try e finally. c) finally e catch. d) finally e retry. e) try e retry.
16712855225
Comentários: É útil para liberar recursos do sistema quando utilizamos, por exemplo, conexões de banco de dados e abertura de buffer para leitura ou escrita de arquivos. finally virá após os blocos de catch. Portanto, o try indica que um bloco de código pode ocorrer erro; o catch tem o objetivo de capturar, manipula e trata erros; e o finally busca realizar ações mesmo após a captura de erros. Vejamos a estrutura básica:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 82 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Conforme vimos em aula, utilizam-se Try e Catch! Gabarito: A 14. (CESPE - 2009 - TRT - 17ª Região (ES) - Técnico Judiciário - Tecnologia da Informação Ao contrário dos tipos primitivos que não são objetos, os tipos de objetos são determinados pela classe de origem. Comentários: Perfeito, perfeito, perfeito! Gabarito: C 15. (CESPE - 2009 - TRT - 17ª Região (ES) - Técnico Judiciário - Tecnologia da Informação Uma classe final indica uma classe que não pode ser estendida. Um método final não pode ser redefinido em classes derivadas. Comentários: //Indica que esse método não pode ser sobrescrito final int soma (int a, int b) {//...//}
//Essa classe não pode ser estendida final class Carro { //...// }
Conforme vimos em aula, a classe final não pode ter filhos e Método Final não pode ser sobrescrita. 16712855225
Gabarito: C
16. (CESPE - SERPRO - Analista - Desenvolvimento de Sistemas A linguagem Java, orientada a objetos, tem como característica ser compilada em um código executado em máquina virtual. Comentários: Java é também uma linguagem portável e multiplataforma! O Compilador é capaz de gerar um código intermediário (bytecode), que permite que o mesmo programa possa ser executado em qualquer máquina ou sistema operacional que possua uma
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 83 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado). Conforme vimos em aula, está perfeito! Qual o nome desse código? Bytecode! Gabarito: C 17. (CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação A instrução import Java.awt.* indica que o programa irá utilizar componentes gráficos. Comentários: Essa questão é polêmica! Alguns afirmar que é possível inserir a instrução, mas não utilizar componentes gráficos. Não faria sentido importar um pacote para não utilizar suas funcionalidades, mas é possível – apesar de má prática! Eu acredito que a questão cabe recurso, sim! Gabarito: C 18. (CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação Em Java, os métodos public de uma classe são utilizados pelos clientes da classe para manipular dados armazenados em objetos dessa classe. Comentários: Pessoal, esses Modificadores de o determinam quão íveis são esses elementos. Vamos vê-los agora em mais detalhes: 16712855225
: essa instrução indica que a classe, método ou atributo assim declaradas podem ser adas em qualquer lugar e a qualquer momento da execução do programa – é o modificador menos restritivo. Perfeito, são públicos para toda e qualquer classe. Gabarito: C 19. (CESPE - 2013 - SERPRO - Analista - Desenvolvimento de Sistemas A tecnologia JSE (Java Small Editon) utilizada pela plataforma iOS permite o desenvolvimento
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 84 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
de aplicações para todos os seus dispositivos, como estações gráficas, iPad, iPod, entre outros. Comentários: Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. Conforme vimos em aula, a questão está cheia de erros! Primeiro, JSE é a sigla de Java Standard Edition. Segundo, a tecnologia proposta no item é o JME! Gabarito: E (CESPE - 2013 - MPOG - Tecnologia da Informação O JME foi criado para trabalhar com ambientes de programação multiprocessados em ambientes distribuídos. Comentários: Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de sistemas corporativos, voltada para aplicações multicamadas, baseadas em componentes executados em servidores de aplicações – ele inclui o Java SE. Contém bibliotecas para o a base de dados, RPC, CORBA, entre outras. As aplicações podem ou não estar na internet. 16712855225
Conforme vimos em aula, Java ME possui diversas limitações de recursos. Na verdade, é o Java EE que é ideal para ambientes distribuídos. Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 85 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
21. (CESPE - 2013 - ANTT - Analista istrativo - Desenvolvimento de Sistemas da Informação JSE, JME, JEE e JCE são edições da tecnologia Java voltadas para o desenvolvimento de aplicações para desktop/servidores, dispositivos móveis, ambientes corporativos e ambientes em nuvem, respectivamente. Comentários: Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. Conforme vimos em aula, está quase tudo certo! No entanto, JCE é uma API de Criptografia (Java Cryptography Extension). Não se trata de uma plataforma ou ambiente de desenvolvimento em nuvem! Gabarito: E (CESPE - HEMOBRÁS - Técnico de Informática O Java dá e a programação concorrente (multithreading). Comentários: Dessa forma, aplicações funcionam da mesma maneira em qualquer ambiente. Podemos dizer que Java é uma linguagem concorrente ou multithreaded, i.e., pode realizar diversas tarefas assincronamente com o uso de threads, que são adas de modo nativo. Java torna a manipulação de threads tão simples quanto trabalhar com qualquer variável. 16712855225
Conforme vimos em aula, Java dá e à programação concorrente. Observem que a própria questão escreveu “a” sem crase. As bancas não ajudam :-( Gabarito: C (CESPE - ANAC - Técnico istrativo - Informática) A linguagem de programação Java permite operações de bit, como, por exemplo, AND (&) e OR (|). Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 86 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
ARITMÉTICOS + * / %
ATRIBUIÇÃO = += -= *= /= %= ++ --
RELACIONAIS > < >= <= != == ? instanceof
LÓGICOS ! && ||
BIT A BIT & | ^ << >> >>>
Conforme vimos em aula, esses são de fato operadores de bit! Gabarito: C 24. (CESPE - 2010 - MPU - Técnico de Informática Na linguagem Java, um objeto do tipo Integer pode receber valor nulo, porém uma variável primitiva int não pode. Comentários:
NOME LÓGICO CARACTERE INTEIRO
DECIMAL
TIPO boolean char byte short int long float double
TAMANHO 16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits
16712855225
MÍNIMO MÁXIMO false true 0 216 – 1 -27 27 – 1 -215 215 – 1 -231 231 – 1 -263 263 – 1 7 Casas Decimais 15 Casas Decimais
DEFAULT false ‘\u0000’ 0 0 0 0 0.0 0.0
Conforme vimos em aula, int é uma variável primitiva que recebe valores inteiros, i.e., não pode receber valor nulo. Já o tipo Integer é um objeto, logo pode receber valores nulos. Gabarito: C ( PE - 2013 - TRT - 10ª REGIÃO (DF e TO) - Técnico Judiciário - Tecnologia da Informação É possível indicar que parte de um código em um método pode gerar uma exceção, por meio da utilização da palavra-chave finally. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 87 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Comentários: É útil para liberar recursos do sistema quando utilizamos, por exemplo, conexões de banco de dados e abertura de buffer para leitura ou escrita de arquivos. finally virá após os blocos de catch. Portanto, o try indica que um bloco de código pode ocorrer erro; o catch tem o objetivo de capturar, manipula e trata erros; e o finally busca realizar ações mesmo após a captura de erros. Vejamos a estrutura básica: Conforme vimos em aula, a questão trata do try e, não, do finally. Gabarito: E (CESPE - 2014 - ANATEL - Analista istrativo - Tecnologia da Informação e Comunicação A linguagem Java possui checked exceptions que estendem java.lang.Exception, em que o compilador força o programador a capturar tais exceções. Essas exceções devem ser tratadas com um bloco try-catch ou com um throws. Comentários:
16712855225
A segunda define erros para os quais as aplicações normalmente têm condições de realizar um tratamento, logo Exception e Error são subtipos de Throwable. As exceções ainda se dividem em verificadas (Checked), quando obrigatoriamente devem ser
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 88 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
tratadas e não-verificadas (Unchecked), quando não há essa obrigação – programador decide! E como se detectam, manipulam e tratam as exceções? Conforme vimos em aula, podemos ter vários blocos catch de um único try. Além disso, de fato elas devem tratadas (try-catch) ou propagadas (throws). Gabarito: C 27. (CESPE – 2004 – STJ - Analista Judiciário - Análise de Sistemas) O Java collections framework da API Java J2SE possui um conjunto de interfaces e implementações que define estruturas usadas para manipular coleções de objetos. As interfaces fundamentais do framework estão associadas à identificação de funcionalidades típicas de estruturas de dados clássicas. Assim, a interface java.util.List está ligada a estruturas de listas, a interface java.util.Set está associada a estruturas do tipo conjuntos e a interface java.util.Map refere-se a estruturas do tipo mapas. Set, List e Map possuem a interface abstrata java.util.Collection como superinterface. Comentários: Por fim, vamos falar sobre os Mapas (java.util.Map). Aqui já começamos diferente, porque mapas não são coleções. Pensem comigo: muitas vezes queremos buscar rapidamente um objeto, dada alguma informação sobre ele (Ex: dada a placa do carro, obter todos os dados). Poderíamos utilizar uma lista e percorrer todos os elementos, mas isso é péssimo para a performance – aqui entra o mapa! Conforme vimos em aula, mapas não são coleções – não são filhos de java.util.Collection. Gabarito: E 16712855225
(CESPE – 2004 – STJ - Analista Judiciário - Análise de Sistemas) As classes java.util.LinkedList e java.util.ArrayList são implementações para listas encadeadas e coleções do tipo arranjos com tamanho modificável, respectivamente, para a interface java.util.List. Comentários: Galera, não sei se algum de vocês já programou em C! Se sim, vocês se lembram de como era complicado utilizar ponteiros, ponteiros para ponteiros, alocação dinâmica de memória? Pois é, Java não exige que você faça nada disso! As coisas aqui são
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 89 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
muito mais simples e já existe bastante funcionalidade implementada e pronta para ser utilizada. As principais classes implementadoras são: ArrayList, LinkedList, Vector. Conforme vimos em aula, essas são – de fato – classes implementadoras de java.util.List. Gabarito: C (CESPE – – ANCINE – Analista de Sistemas) Os tipos de dados HashSet, ArrayList e HashMap são classes que implementam os tipos de dados Set, List e Map, respectivamente. Comentários: Galera, não sei se algum de vocês já programou em C! Se sim, vocês se lembram de como era complicado utilizar ponteiros, ponteiros para ponteiros, alocação dinâmica de memória? Pois é, Java não exige que você faça nada disso! As coisas aqui são muito mais simples e já existe bastante funcionalidade implementada e pronta para ser utilizada. As principais classes implementadoras são: ArrayList, LinkedList, Vector. Como os conjuntos não possuem ordem, as operações baseadas em índice que existem nas listas não aparecem nos conjuntos. Set é a interface Java que define os métodos que um conjunto deve implementar. As principais classes implementadoras são: HashSet, TreeSet e LinkedHashSet. Cada implementação possui suas características sendo apropriadas para contextos diferentes. Em um dicionário eu associo um vocábulo a uma definição. A chave é um objeto utilizado para recuperar um valor. O mapa costuma aparecer junto com outras coleções, para poder realizar essas buscas. As principais classes implementadoras da interface Map são: HashMap, TreeMap e LinkedHashMap. Cada implementação possui suas características sendo apropriadas para contextos diferentes. 16712855225
Conforme vimos em aula, a questão está perfeita! Gabarito: C (CESPE – – SGA/AC – Analista de Sistemas – C ArrayList implementa a interface List e Collection. Comentários: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 90 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Galera, não sei se algum de vocês já programou em C! Se sim, vocês se lembram de como era complicado utilizar ponteiros, ponteiros para ponteiros, alocação dinâmica de memória? Pois é, Java não exige que você faça nada disso! As coisas aqui são muito mais simples e já existe bastante funcionalidade implementada e pronta para ser utilizada. As principais classes implementadoras são: ArrayList, LinkedList, Vector. Conforme vimos em aula, ArrayList é uma classe implementadora da Interface List, que por sua vez estende a interface java.util.Collection. ArrayList não implementa Collection diretamente. Gabarito: E 31. (CESPE – 2008 – MPE/RR - Analista de Sistemas) O pacote java.awt contém diversas classes para criar interfaces gráficas de usuário em aplicações Java. Comentários: A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes e interfaces que definem os componentes visuais necessários para construir uma interface gráfica de usuário. Conforme vimos em aula, trata-se de um pacote de classes para criar interfaces gráficas de usuário em Java. Gabarito: C 16712855225
(CESPE – – MPE/RR - Analista de Sistemas) No AWT, um componente é qualquer classe que possa ser representada em uma tela sem interação com usuário. Comentários: A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes e interfaces que definem os componentes visuais necessários para construir uma interface gráfica de usuário. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 91 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Conforme vimos em aula, trata-se de uma interface com o usuário, logo interage com o usuário. Gabarito: E (CESPE – – MPE/RR - Analista de Sistemas) O Swing a o desenvolvimento de interfaces gráficas para usuários (GUI) com o uso da IDE NetBeans Comentários: A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes e interfaces que definem os componentes visuais necessários para construir uma interface gráfica de usuário. Conforme vimos em aula, a questão está correta! Qual a IDE utilizada pouco importa, o swing a o desenvolvimento de GUI e ponto final! Gabarito: C 34. (CESPE – 2011 – MEC - Analista de Sistemas) AWT é um conjunto de componentes GUI, integrante da arquitetura JEE6, constante no pacote java.awt, desenvolvidas para substituir as GUIs do SWING. Comentários: 16712855225
O AWT (javax.awt) veio primeiro, é mais pesado, é gerado pelo sistema operacional, logo é dependente de plataforma. O Swing (javax.swing) é mais leve, é gerado por uma Máquina Virtual Java (JVM), logo é independente de plataforma. Galera, nem tudo é diferente! Vejam: ambos são fáceis de programar, porque a orientação a objetos proporciona alterar partes do programa, sem alterar toda a estrutura. Conforme vimos em aula, AWT veio primeiro que o Swing! Esse último veio dar mais dinamismo e leveza aos componentes – hoje em dia, pouco se usa de AWT! Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 92 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(CESPE – 2015 – TCU - Analista de Sistemas No contexto de um código na linguagem Java, o comando a seguir é utilizado com a finalidade específica de ar para o campo de visibilidade pública saldo o valor da variável deposito com o tipo double. public void saldo (double deposito). Comentários: A redação ficou um pouco confusa, mas vejam que a questão fala em ar para campo. Que campo? O saldo é um método e, não, um campo. Gabarito: E (CESPE – 2014 – ANATEL - Analista de Sistemas No JSE (Java Standard Edition) versão 8, é possível utilizar recursos inerentes à programação funcional por meio de uma nova característica da linguagem chamada expressões Lambda, que permitem o tratamento de funções como argumentos de métodos. Comentários: Pessoal, vocês já devem saber que nós temos uma nova versão! A cobrança ainda é raríssima (só encontrei uma questão), mas é bom saber um pouco sobre as principais novidades. A grande novidade foram as Lambda Expressions! Pois é, Java agora tem algumas características de programação funcional. Professor, o que é exatamente programação funcional? É um paradigma de programação que trata a computação como uma avaliação de funções matemáticas e que evita estados ou dados mutáveis. Ela enfatiza a aplicação de funções, em contraste com a programação imperativa, que enfatiza mudanças no estado do programa. As Lambda Expressions permitem ar comportamentos, ou funções como argumentos em uma chamada de método. 16712855225
Conforme vimos em aula, a questão está perfeita! Gabarito: C ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 93 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(FCC - 2011 - TRE-RN - Técnico Judiciário - Programação de Sistemas Em relação ao Java Standard Edition, é INCORRETO afirmar: a) Possui gerenciamento de memória embutido, por meio do coletor de lixo. b) Ambiente indicado para o desenvolvimento de aplicativos para dispositivos móveis ou portáteis. c) Permite o desenvolvimento de aplicações desktop de linha de comando e interfaces gráficas Swing. d) Portabilidade dos programas compilados para diversos sistemas operacionais, sem necessidade de recompilação. e) Usa conceitos tais como orientação a objetos e multithreading. Comentários: O o a arrays e strings, e a conversão de tipos são checados em tempo de execução para assegurar a sua validade. O Garbage Collector faz a desalocação automática de memória evitando, erros de referência e desperdício de memória. Finalmente, o recurso de Exception Handling permite o tratamento de erros em tempo de execução, por um mecanismo robusto, análogo ao do C++. 16712855225
(a) Conforme vimos em aula, ele contém um Garbage Collector para gerenciamento de memória; Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 94 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(b) Conforme vimos em aula, esse é o Java ME (Java Micro Edition); A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes e interfaces que definem os componentes visuais necessários para construir uma interface gráfica de usuário. (c) Conforme vimos em aula, ele permite desenvolvimento de aplicações desktop e de interfaces gráficos (Swing e AWT); Vocês sabiam que Java é uma Linguagem WORA? Pois é, esse acrônimo significa Write Once, Run Anywhere ou Escreva uma vez, execute em qualquer lugar. Tratase de um slogan para exemplificar os benefícios multiplataforma da linguagem Java! Idealmente, isso significa que um programa em Java (uma vez compilado em um bytecode) pode rodar em qualquer equipamento que possua uma JVM! (d) Conforme vimos em aula, é uma linguagem WORA (Write Once, Run Anywhere); Dessa forma, aplicações funcionam da mesma maneira em qualquer ambiente. Podemos dizer que Java é uma linguagem concorrente ou multithreaded, i.e., pode realizar diversas tarefas assincronamente com o uso de threads, que são adas de modo nativo. Java torna a manipulação de threads tão simples quanto trabalhar com qualquer variável. (e) Conforme vimos em aula, é uma linguagem orientada a objetos e possui e nativo a threads; 16712855225
Gabarito: B
(FCC - 2010 - TRT - 22ª Região (PI) - Técnico Judiciário - Tecnologia da Informação A plataforma Java disponibiliza um interpretador que traduz, em tempo de execução, o bytecode para instruções nativas do processador, permitindo, dessa forma, que uma mesma aplicação seja executada em qualquer plataforma computacional que possua essa implementação. Trata-se de: a) Java Virtual Machine. b) Java API. c) JavaBeans. d) J2SE. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 95 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
e) JavaFX. Comentários: O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um programa que carrega e executa os aplicativos Java, convertendo bytecodes em código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é, isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java. Conforme vimos em aula, trata-se da Java Virtual Machine (JVM)! Gabarito: A (FCC - 2010 - Sergipe Gás S.A. - Analista de Sistemas É tida como uma das principais linguagens de programação orientada a objeto; tem como característica a compilação para um bytecode e execução por uma máquina virtual. Trata-se da linguagem: a) Algol. b) Delphi. c) C++. d) Java. e) PHP. Comentários: Java é também uma linguagem portável e multiplataforma! O Compilador é capaz de gerar um código intermediário (bytecode), que permite que o mesmo programa possa ser executado em qualquer máquina ou sistema operacional que possua uma JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado). 16712855225
Conforme vimos em aula, trata-se da linguagem Java. Gabarito: D (FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - e de Web Os aplicativos Java “rodam” em diferentes ambientes. A tradução dos
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 96 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
códigos Java (bytecode), para instruções específicas de cada sistema e dispositivo, é uma função do programa: a) Java Community Process (J). b) Java Virtual Module (JVM). c) Java Virtual Machine (JVM). d) Java Comunication Process (J). e) Java Enterprise Machine (JEM). Comentários: O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um programa que carrega e executa os aplicativos Java, convertendo bytecodes em código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é, isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java. Conforme vimos em aula, trata-se da Java Virtual Machine (JVM)! Gabarito: C (FCC - 2009 - -SE - Técnico Judiciário - Programação de Sistemas Um objeto é instanciado em Java por meio do operador: a) instanceof. b) extend. c) new. d) this. e) type.
16712855225
Comentários:
Palavras
Descrição Testa se um objeto é uma instância de uma classe específica ou se é null.
Instanceof
Extends
Utilizado para aplicar o conceito de herança para uma classe, onde uma classe receberá os métodos e variáveis de instância da classe chamada de pai.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 97 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Utilizada para se criar novas instâncias de objetos. New Representa a instância que está atualmente sendo executada. This Conforme vimos em aula, trata-se da palavra-reservada new – lembrando que type não é um operador! Gabarito: C (FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação Uma classe Java pode ser instanciada por um comando, cuja sintaxe é: a) nome_Objeto nome_Classe = new nome_Objeto(); b) nome_Classe nome_Objeto = new nome_Classe(); c) nome_Classe nome_instancia = new nome_Objeto(); d) nome_Instancia nome_Objeto = new nome_Instancia(); e) nome_Instancia nome_Classe = new nome_Instancia(); Comentários: /* 1) Operador NEW é responsável por criar um objeto; * 2) NomeClasse() é o construtor da Classe NomeClasse; * 3) NomeObjeto é uma variável do Tipo NomeClasse; */ NomeClasse NomeObjeto = new NomeClasse(); /* Observem que é possível atribuir o objeto de uma * classe para uma variável de outra classe */
16712855225
Conforme vimos em aula, o operador new cria um novo objeto! Para tal, utiliza-se o construtor da classe que se deseja criar uma instância: Nome_Classe( ). Por fim, ele atribui esse novo objeto a uma variável Nome_Objeto pertencente a classe Nome_Classe. Gabarito: B (FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação A diretiva public é utilizada em Java para aplicar a encapsulação pública:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 98 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
a) aos métodos e classes, apenas. b) aos atributos, métodos e classes. c) às classes, apenas. d) aos atributos, apenas. e) aos atributos e classes, apenas. Comentários: Pessoal, esses Modificadores de o determinam quão íveis são esses elementos. Vamos vê-los agora em mais detalhes:
: essa instrução indica que a classe, método ou atributo assim declaradas podem ser adas em qualquer lugar e a qualquer momento da execução do programa – é o modificador menos restritivo. Conforme vimos em aula, o public pode ser aplicado a atributos, métodos e classes. Gabarito: B (FCC - 2008 - TCE-AL - Programador Em Java, para alterar a visibilidade do elemento em que se aplica, entre outros, utiliza-se o modificador de o: a) static. b) abstract. c) protected. d) volatile. e) transient. 16712855225
Comentários: Pessoal, esses Modificadores de o determinam quão íveis são esses elementos. Vamos vê-los agora em mais detalhes: <protected>: essa instrução indica que métodos ou atributos (classes, não) assim declaradas somente podem ser adas dentro do pacote em que está contida ou por subclasses no mesmo pacote. Apenas um desses é um Modificador de o: protected.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 99 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Gabarito: C (FCC - 2007 - MPU - Analista de Informática - Desenvolvimento de Sistemas Analise os seguintes valores, variáveis e operações usando expressões Java: byte j = 30; short k = 54; int m = 40; long n = 12L; long resultado = 0L; resultado += j; resultado += k; resultado /= n; resultado -= m;
Após a última operação, o resultado será igual a: a) -7. b) -32. c) -33. d) 60. e) 84. Comentários: resultado = resultado + j = 0L + 30 = 30L; //Houve cast implícito resultado = resultado + j = 30L + 54 = 84L; //Houve cast implícito resultado = resultado/n = 84L/12L = 7L; resultado = resultado m = 7L 40 = -33L //Houve cast implícito
Gabarito: C 10. (FCC - TRE-MG - Técnico Judiciário - Programação de Sistemas Os métodos Java que não retornam valores devem possuir no parâmetro tipo-deretorno a palavra: 16712855225
a) static. b) public. c) void. d) main. e) string args. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 100 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Palavras
Descrição Representa um retorno vazio, i.e., nenhum retorno para esse método.
Void
Conforme vimos em aula, trata-se da palavra-reservada void. Gabarito: C 11. (FCC - 2012 - TST - Analista Judiciário - Análise de Sistemas) Considere o programa abaixo escrito na linguagem Java: public class Programa { public static void main(String args[]) { for(int i=3; i<20; i+=2) { System.out.print((i%3) + ""); } } }
O resultado a ser informado ao usuário após a execução do programa acima é: a) 0 0 1 0 0 1 0 0 1 b) 0 1 2 0 1 2 0 1 2 c) 0 1 0 1 0 1 0 1 0 d) 1 2 1 2 1 2 1 2 1 e) 0 2 1 0 2 1 0 2 1 Comentários: i = 3; i = 5; i = 7; i = 9; i = 11; i = 13; i = 15; i = 17; i = 19;
3%3 5%3 7%3 9%3 11%3 13%3 15%3 17%3 19%3
16712855225
= 0; = 2; = 1; = 0; = 2; = 1; = 0; = 2; = 1;
Lembrando que o Operador % oferece o resto da divisão entre dois números. Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 101 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
12. (FCC - 2012 - MPE-AP - Analista Ministerial - Tecnologia da Informação Analise o código das classes a seguir presentes em um mesmo pacote de um projeto Java: public class NewClassA { public double calcular(int x, int y) { return x + y; } public double calcular(double x, double y) { return x * y; } } public class NewClassB extends NewClassA { } public class Start { public static void main(String[] args) { } }
Com base nos códigos apresentados e nos conceitos da orientação a objetos é correto afirmar: a) No método main da classe Start não é possível instanciar objetos das classes NewClassA e NewClassB, pois essas classes não contêm um construtor válido. b) Se for digitada a instrução NewClassB c = new NewClassA(); no método main da classe Start será instanciado um objeto da NewClassA. c) Se for digitada a instrução NewClassA b = new NewClassB(); no método main da classe Start ocorrerá um erro, pois não é possível criar um objeto da NewClassA por meio do construtor da NewClassB. 16712855225
d) A existência de dois métodos de mesmo nome na NewClassA que recebem a mesma quantidade de parâmetros indica que está ocorrendo uma sobrescrita de métodos. e) Por meio de um objeto da NewClassB será possível ar os métodos presentes na NewClassA. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 102 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(a) Não, mesmo que não tenha um construtor explícito, o compilador cria um construtor padrão no momento da criação do objeto; (b) Não, não se pode atribuir uma instância de classe-pai a variável de uma classe-filha; (c) Não, não haveria erro! Pode-se atribuir uma instância de classe filha a variável de uma classe-pai; (d) Não, isso é sobrecarga; (e) Perfeito, ela herda tudo da classe-pai. Gabarito: E 13. (FCC - 2012 - TCE- - Auxiliar de Fiscalização Financeira Em um programa Java, considere a existência de uma variável do tipo long chamada cod contendo o valor 1234. Para ar o valor contido nessa variável para uma variável do tipo byte chamada codNovo, deve-se fazer casting. Para isso, utiliza-se a instrução: byte codNovo = a) Byte.valueOf(cod); b) (long) cod; c) Byte.pasreByte(cod); d) (byte) cod; e) (cast) cod; Comentários:
16712855225
Conforme vimos em aula, estamos indo do valor maior para o valor menor, portanto precisamos fazer um cast explícito: byte codNovo = (byte) cod. Gabarito: D 14. (FCC - 2012 - TRE- Técnico Judiciário - Programação de Sistemas Para chamar o método soma da classe Calculo, e mostrar na tela o retorno desse método, é correto utilizar:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 103 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 public class Calculo { public static double soma(double n1, double n2) { return n1 + n2; } public static double soma(double n1, double n2, double n3) { return n1 + n2 + n3; } }
a) Calculo c = new Calculo(); System.out.println (c.soma(10, 20, 30)); ou System.out.println (Calculo.soma(10, 20)); b) Exclusivamente as instruções Calculo c = new Calculo(); System.out.println (c.soma(10, 20)); c) Exclusivamente a instrução System.out.println (Calculo.soma(10, 20, 50)); d) Exclusivamente as instruções Calculo c = new Calculo(); double r = c.soma(10, 20); System.out.println(r); e) Calculo c = Calculo.soma(10,20,30); System.out.println (Calculo.soma(10, 20));
System.out.println
(c);
ou
Comentários: Vamos lá! Observem que há dois métodos estáticos, i.e., não é necessário criar um objeto dessa classe para ter o aos seus métodos. Logo, há duas possibilidades: pode-se instanciar um objeto dessa classe (Calculo c = new Calculo();) e chamar o método pelo objeto (c.soma()) ou fazer o mesmo sem utilizar o objeto (Calculo.soma()). Portanto, as letras B, C, D funcionariam, mas não exclusivamente, porque pode-se ar o método pelo objeto ou pela classe. 16712855225
Gabarito: A 15. (FCC - 2012 - TRE- Técnico Judiciário - Programação de Sistemas Com relação a herança na programação orientada a objetos com Java, é INCORRETO afirmar: a) Uma subclasse herda os métodos da superclasse, entretanto, pode ter seus próprios métodos. b) Quando se instancia um objeto da subclasse, podem ser ados valores para os atributos da superclasse. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 104 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
c) Um objeto da subclasse pode ser um objeto da superclasse. d) Em uma superclasse, para ar métodos da subclasse deve ser usada a instrução super. e) Para definir que a subclasse herda as características da superclasse utiliza-se a instrução extends na declaração da subclasse. Comentários: (a) Perfeito, ela pode criar seus próprios métodos; (b) Perfeito, porque eles são herdados; (c) Perfeito, eles são herdados da superclasse; (d) Não, super é utilizado para ar métodos da superclasse; (e) Perfeito, esse operador indica que a superclasse será estendida. Gabarito: D 16. (FCC - 2011 - TRT - 4ª REGIÃO (RS) - Técnico Judiciário - Tecnologia da Informação No ambiente de programação Java: a) uma classe abstrata permite apenas métodos abstratos. b) o corpo de um método abstrato termina com ponto e vírgula e a declaração é delimitada por chaves. c) uma interface pode definir tanto métodos abstratos quanto não abstratos. d) a herança múltipla permite que mais classes sejam estendidas. e) toda classe é uma subclasse direta ou indireta da classe Object. Comentários:
16712855225
Cada classe, na hierarquia de classes, representa uma camada que adiciona diversas capacidades a um objeto. No topo desta hierarquia você sempre vai encontrar uma classe chamada de Object (Objeto). Qualquer classe estende implicitamente (sem necessidade de declarar) a classe Object. Claro que, na maioria das vezes, isso ocorre indiretamente. (a) Não, ela permite métodos concretos; (b) Não, não tem chaves; (c) Não, todos os métodos são abstratos; (d) Java não a herança múltipla; (e) Perfeito, absolutamente todas as classes são filhas da Classe Object.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 105 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Gabarito: E 17. (FCC - 2010 - TRT - 8ª Região (PA e AP) - Analista Judiciário - Tecnologia da Informação São tipos primitivos da linguagem Java: a) int, string, long e real. b) char, int, real e bit. c) boolean, double, float e byte. d) real, short, long e char. e) string, long int, short int e float. Comentários:
NOME LÓGICO CARACTERE INTEIRO
DECIMAL
TIPO boolean char byte short int long float double
TAMANHO 16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits
MÍNIMO MÁXIMO false true 0 216 – 1 -27 27 – 1 -215 215 – 1 -231 231 – 1 -263 263 – 1 7 Casas Decimais 15 Casas Decimais
DEFAULT false ‘\u0000’ 0 0 0 0 0.0 0.0
(a) string e real, não; (b) real e bit, não; (c) Perfeito! (d) real, não; (e) apenas float. Gabarito: C 18. (FCC - 2010 - - - Agente Legislativo de Serviços Técnicos e istrativos - Processamento de Dados Os tipos de dados primitivos em Java são: 16712855225
a) char, boolean, byte, short, int, long, float e double. b) char, boolean, byte, short, int, long, float, double e String. c) byte, short, int, long, float e double. d) byte, short, int, long, float, double, String e Date. e) char, boolean, byte, short, int, long, float, double, String e Date. Comentários:
NOME
TIPO
Prof. Diego Carvalho
TAMANHO
MÍNIMO
MÁXIMO
www.estrategiaconcursos.com.br
DEFAULT Pág. 106 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
LÓGICO CARACTERE INTEIRO
DECIMAL
boolean char byte short int long float double
16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits
false true 0 216 – 1 -27 27 – 1 -215 215 – 1 -231 231 – 1 -263 263 – 1 7 Casas Decimais 15 Casas Decimais
false ‘\u0000’ 0 0 0 0 0.0 0.0
São oito tipos: byte, short, int, long, float, double, char e boolean. Gabarito: A 19. (FCC - 2009 - TRT - 15ª Região - Analista Judiciário - Tecnologia da Informação No âmbito da linguagem Java, considere: I. Edição é a criação do programa, que também é chamado de código Bytecode. II. Compilação é a geração de um código intermediário chamado fonte, que é um código independente de plataforma. III. Na interpretação, a máquina virtual Java ou JVM analisa e executa cada instrução do código Bytecode. IV. Na linguagem Java a interpretação ocorre apenas uma vez e a compilação ocorre a cada vez que o programa é executado. Está correto o que consta em: 16712855225
a) I, II, III e IV. b) II e IV, somente. c) III e IV, somente. d) IV, somente. e) III, somente. Comentários: (I) Não, bytecode é o resultado da compilação do código-fonte; (II) Não, o código intermediário é chamado bytecode; (III) Perfeito, é exatamente assim; (IV) Não, a
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 107 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
compilação ocorre apenas uma vez e a interpretação a cada vez que o programa é executado. Gabarito: E (FCC - 2008 - TCE-AL - Programador Os três elementos básicos quando contidos num arquivo fonte Java devem obrigatoriamente se apresentar na seguinte ordem: a) import, package e class. b) class, package e import. c) class, import e package. d) package, class e import. e) package, import e class. Comentários: A diferença entre as duas formas de importação de pacotes é o consumo de recursos do computador. Como o asterisco importa todos os sub-pacotes, o consumo de memória será alto e, muito provavelmente, não usaremos todas as classes de todos os pacotes importados. Por isso, o recomendado é sempre importar apenas o pacote que será utilizado. A ordem é Package Import Class. Conforme vimos em aula, deve-se declarar o pacote; depois, import; por fim, classe. Gabarito: E 21. (FCC - 2014 – TRF/3 – Analista de Sistemas Considere a classe escrita em Java: 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 108 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
O valor que será impresso na execução do método main é: a) 6.0 b) 7 c) 8.0 d) 5.0 e) 12.5 Comentários: Isso é um exemplo de polimorfismo! A questão é: qual método multi será utilizado? Ele envia os valores 2.5 e 2! Ele pode entrar no primeiro método? Não, porque o valor-padrão de número decimal no Java é Double, logo – para entrar no primeiro método – teria que enviar o valor 2.5f, visto que é do tipo Float. Ele pode entrar no segundo método? Não, visto que o valor 2.5 não pode ser inteiro! Ele pode entrar no terceiro método? Sim, visto que o valor 2.5 é Double e o valor 2 é inteiro! Eu posso ar um valor inteiro a uma variável do tipo Double? Sim, o que eu não posso fazer é o contrário. Logo, o valor impresso será 2.5*2+3 = 8.0. Gabarito: C (FCC - TCE-AL - Programador Considerando que as variáveis Java X, Y e Z foram todas inicializadas com zero, os resultados das mesmas após as alterações realizadas pelas atribuições X *= 2, Y -= 5 e Z /=3, respectivamente, serão: a) 0, -5 e 0 b) 0, 5 e 0 c) 1, -5 e 3 d) 2, -5 e 3 e) 2, 5 e 3
16712855225
Comentários: X = X*2 = 0*2 = 0; Y = Y-5 = 0-5 = -5; Z = Z/3 = 0/3 = 0;
Portanto, a resposta é 0, -5 e 0.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 109 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Gabarito: A (FCC - 2008 - MPE-RS - Técnico em Informática - Área Sistemas A função Java: public boolean VerificarF (string F); representa um exemplo do conceito de: a) override. b) overload. c) herança. d) encapsulamento. e) polimorfismo. Comentários: Essa questão é estranha! Ele não especifica exatamente o que ele quer saber, mas vamos lá: por eliminação! (a) Impossível inferir algo sobre isso; (b) Impossível inferir algo sobre isso; (c) Impossível inferir algo sobre isso; (d) Bem, há um modificador de o, portanto representa um exemplo do conceito de encapsulamento; (e) Impossível inferir algo sobre isso. Gabarito: D 24. (FCC - 2007 - MPU - Analista de Informática - Desenvolvimento de Sistemas Quanto às variáveis Java, um inteiro de 64 bits em notação de complemento de dois que pode assumir valores entre -263 e 263 -1 é: a) long. b) short. c) float. d) byte. e) double.
16712855225
Comentários:
NOME LÓGICO CARACTERE INTEIRO
TIPO boolean char byte
Prof. Diego Carvalho
TAMANHO 16 bits 8 bits
MÍNIMO false 0 -27
MÁXIMO true 216 – 1 27 – 1
www.estrategiaconcursos.com.br
DEFAULT false ‘\u0000’ 0 Pág. 110 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
DECIMAL
short int long float double
-215 215 – 1 -231 231 – 1 -263 263 – 1 7 Casas Decimais 15 Casas Decimais
16 bits 32 bits 64 bits 32 bits 64 bits
0 0 0 0.0 0.0
Conforme vimos em aula, trata-se do tipo long. Gabarito: A (FCC - 2005 - TRE-MG - Técnico Judiciário - Programação de Sistemas A seqüência de etapas para implementação de um programa Java é: a) interpretação, codificação, execução e compilação. b) codificação, interpretação, compilação e execução. c) interpretação, codificação, compilação e execução. d) codificação, compilação, interpretação e execução. e) compilação, codificação, execução e interpretação. Comentários: O bytecode é um código intermediário, que é posteriormente interpretado e executado por uma Java Virtual Machine (JVM). O que é isso, professor? É um programa que carrega e executa os aplicativos Java, convertendo bytecodes em código executável. Lembram que eu falei que Java é uma Linguagem WORA? Pois é, isso ocorre em grande parte por conta do bytecode e da Máquina Virtual Java. Conforme vimos em aula, devemos codificar o programa em .java; esse arquivo é compilado em um código intermediário (bytecode) em .class; depois é interpretado em uma JVM; e, por fim, é executado. 16712855225
Gabarito: D (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas Considere a variável idade declarada no método main de uma classe Java, com a seguinte instrução: int idade=12;
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 111 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Analise: I. System.out.println (idade<18?"Menor de idade":"Maior de idade"); II. if(idade<18) {System.out.println("Menor {System.out.println("Maior de idade");}
de
idade");}
else
III. if(idade<18) {System.out.println("Menor de idade");} else if (idade>=18) {System.out.println("Maior de idade");} IV. switch(idade) {case<18: System.out.println("Menor de idade"); break; case>=18: System.out.println("Maior de idade");} Contém uma instrução correta que exibirá na tela a frase "Menor de idade": a) I, II, III e IV. b) I, II e III, apenas. c) II e III, apenas. d) II, apenas. e) I e III, apenas. Comentários: (I) Operador Ternário: 12 é menor que 18, portanto irá imprimir “Menor de Idade”; (II) 12 é menor que 18, portanto irá imprimir “Menor de Idade”; (III) 12 é menor que 18, portanto irá imprimir “Menor de Idade”; (IV) Case não aceita <, >, <=, >=, etc. Gabarito: B 16712855225
27. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas) Considere a estrutura de repetição seguinte: public static void main(String{} args) { int cont=1, r=0; cont=1; do { r=r+cont; cont+=4; } while(cont<=5); System.out.println(r); System.out.println(cont); }
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 112 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
A saída na tela será: a) 15 e 6. b) 1 e 5. c) 0 e 1. d) 6 e 9. e) 9 e 7. Comentários: r = r + cont = 0 + 1 = 1; cont = cont + 4 = 1 + 4 = 5; r = r + cont = 1 + 5 = 6; cont = cont + 4 = 5 + 4 = 9; //Sai do loop Portanto, r = 6 e cont = 9. Gabarito: D (FCC - 2011 - TRE-AP - Técnico Judiciário - Programação de Sistemas Em relação à plataforma de desenvolvimento JSE, considere: I. Possibilita o desenvolvimento de aplicações desktop através de linha de comando e através da interface gráfica Swing. II. É multiplataforma: permite a portabilidade dos programas compilados para diversos sistemas operacionais, sem necessidade de alteração do código ou de recompilação. 16712855225
III. Faz uso explícito de ponteiros e usa conceitos modernos, tais como, orientação a objetos e e a multithreading. IV. Possui o gerenciamento de memória embutido, por meio do garbage collector. Está correto o que se afirmar em: a) I, II e III, somente. b) I, II e IV, somente. c) I, III e IV, somente. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 113 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
d) II, III e IV, somente. e) I, II, III e IV. Comentários: (I) Perfeito, é possível desenvolver aplicações desktop utilizando interface gráfica, como Swing e AWT; (II) Perfeito, é uma linguagem WORA (Write Once, Run Anywhere); (III) Não, não faz uso explícito de ponteiros; (IV) Perfeito, o Garbage Collector realiza o gerenciamento de memória. Gabarito: B (FCC - 2011 - INFRAERO - Analista de Sistemas - Desenvolvimento e Manutenção No Java, um tipo inteiro (int) utiliza quatro bytes para armazenamento. A faixa máxima possível de valores inteiros para se armazenar em uma variável do tipo primitivo int é de: a) -8388608 a 8388607. b) -128 a 127. c) -32768 a 32767. d) -9223372036854775808 a 9223372036854775807. e) -2147483648 a 2147483647. Comentários:
NOME LÓGICO CARACTERE INTEIRO
DECIMAL
TIPO boolean char byte short int long float double
TAMANHO 16 bits 8 bits 16 bits 32 bits 64 bits 32 bits 64 bits
16712855225
MÍNIMO MÁXIMO false true 0 216 – 1 -27 27 – 1 -215 215 – 1 -231 231 – 1 -263 263 – 1 7 Casas Decimais 15 Casas Decimais
DEFAULT false ‘\u0000’ 0 0 0 0 0.0 0.0
Basta fazer a conta: -231 a 231 – 1 = -2147483648 a 2147483647. Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 114 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(FCC - 2010 - TRT - 9ª REGIÃO (PR) - Técnico Judiciário - Tecnologia da Informação O JVM mais o núcleo de classes da plataforma Java e os arquivos de e formam o: a) o J2EE. b) o JDK. c) o JRE. d) uma JSP. e) uma API. Comentários: Um programa escrito para a plataforma Java necessita de um ambiente de execução chamado Java Runtime Environment (JRE)! O que tem nesse negócio, professor? Ele contém uma Máquina Virtual (JVM) e Bibiliotecas (APIs). E o Java Development Kit (JDK)? Bem, eles contêm a JRE e outros componentes úteis para executar aplicações (Exemplo: Javac, Javadoc, Jar, Appletviewer, Jconsole, Jstack, Jhat, etc). Conforme vimos em aula, trata-se da Java Runtime Environment (JRE): ambiente mínimo necessário para rodar aplicativos Java. Gabarito: C 31. (FCC - 2014 - TRT - 16ª REGIÃO (MA) - Analista Judiciário - Tecnologia da Informação Considere as classes a seguir, presentes em uma aplicação Java orientada a objetos:
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 115 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
16712855225
Em uma classe principal foram digitadas, no interior do método main, as seguintes linhas:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 116 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
As linhas que contêm a instrução s = f.calcularSalario( ); demonstram um conceito da orientação a objetos conhecido como: a) encapsulamento. b) sobrecarga de métodos. c) polimorfismo. d) sobrescrita de construtores. e) métodos abstratos. Comentários: Primeiro, vamos analisar o código! Saca só... temos três classes: Funcionário, Mensalista e Diarista. Observe que as classes Mensalista e Diarista 'estendem' a classe Funcionário, i.e., são filhas de Funcionário! Agora vamos analisar cada classe: A classe Funcionário possui dois construtores: Funcionário( ) e Funcionário(int id, String nome, double valorBase), além dos métodos getValorBase( ) e calcularSalario( ). Aí você vai me dizer: professor, tem dois construtores? Sim, com mesmo nome e s diferentes! Portanto, temos uma: Sobrecarga (Overloading) de Construtores. Bacana? Já a classe Mensalista possui um construtor Mensalista(double descontos, int id, String nome, double valorBase) e um método calcularSalario( ). Opa, perae... esse método é igual ao método da classe Funcionário, concorda? Mesmo nome e mesma ! Portanto, temos uma Sobrescrita (ou Override) de métodos. Por fim, a classe Diarista possui um construtor Diarista(int diasPorSemana, int id, String nome, double valorBase) e um método calcularSalario( ). De novo, você vai dizer: professor, esse método também é igual àquele da classe Funcionário e Mensalista. É verdade, portanto temos uma Sobrescrita (ou Override) de métodos. 16712855225
Agora vamos para o método main! Observe que ele cria uma variável f do tipo Funcionário. Em seguida, ele cria um objeto Diarista e atribui à variável f. Professor, pode isso? Sim, eu posso atribuir um objeto de uma classe-filha para uma variável do tipo da classe-pai - eu não posso é fazer o contrário (pelo menos, sem um casting). Na linha seguinte, ele diz: s = f.calcularSalario( ). Chegamos ao ponto crucial! Ele chama o método calcularSalario( ), mas você lembra que nós temos 3 métodos com esse nome? Temos um na classe-pai e dois nas classes-filhas, sobrescrevendo o método da classe-pai. E qual desses ele está Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 117 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
chamando? Lembra que na linha anterior ele diz que f recebe o objeto da classe Diarista? Pois é, portanto, o método calcularSalario( ) é aquele da classe Diarista. Mais abaixo, ele faz exatamente a mesma coisa, mas atribui o objeto Mensalista() à variável f, portanto, na segunda vez que ele chama esse método, refere-se ao objeto da classe Mensalista. Entendido? Agora vamos para os itens: (a) Encapsulamento? Não, não tem nenhum modificador de o aí; (b) Sobrecarga de Métodos? Não! Lá em cima, há sobrecarga de construtores. Nessa linha, há sobrescrita de métodos. (c) Polimorfismo? Perfeito! Nós temos uma sobrescrita de métodos (que é um tipo de Polimorfismo). (d) Sobrescrita de Construtores? Não! Lá em cima, há sobrecarga de construtores. Nessa linha, há sobrescrita de métodos. (e) Métodos Abstratos? Não, não há nenhum método abstrato nessa questão. Aí você vai me dizer: Professor, mas um construtor é um tipo de método! Logo, se há uma sobrecarga de construtores, há uma sobrecarga de métodos! Sim, concordo contigo! No entanto, temos que lembrar que é uma questão da FCC! Nesse caso, a terceira opção não apresenta problema algum! Já a segunda opção, pode-se dizer que não é exatamente sobrecarga de métodos; é algo mais específico, é uma sobrecarga de construtores. Percebe? Dessa forma, eu recomendo não brigar com a banca e marcar a opção que não gera dúvidas. Agora... se for bastante técnico aqui, você está corretíssimo! A questão possui duas respostas e deveria ser anulada. 16712855225
Gabarito: C
(FCC - 2010 - - - Agente Legislativo de Serviços Técnicos e istrativos - Processamento de Dados Métodos estáticos em Java são aqueles que: a) realizam alguma tarefa que é dependente do conteúdo de algum objeto. b) não podem ser ados diretamente pelo nome da classe a que pertencem, mas sim por meio de um objeto da classe. c) realizam alguma tarefa que não é dependente do conteúdo de algum objeto.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 118 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
d) são ados por objetos que não necessitam de ser instanciados explicitamente. e) existem em subclasses de uma herança. Comentários: (a) Não, é estático, logo não depende de objetos; (b) Não, é justamente o inverso; (c) Perfeito, não depende de objetos! (d) Na verdade, precisam sim ser instanciados explicitamente; (e) Isso não define um método estático. Gabarito: C (FCC -
- TCE-AL - Programador NÃO são nomes válidos em Java:
a) _Real e $real b) um1 e dois2 c) 3tres e tres3 d) Codigo e codigo e) cod_valor e cod$valor Comentários: Deve ser a combinação de uma ou mais letras e dígitos UNICODE-16: Letras: A-Z; Letras: a-z; Underscore: _ ; Cifrão: $ ;Números: 0-9. 1. Não pode ser uma palavra-reservada (palavra-chave); 2. Não pode ser true, false ou null; Não pode começar com números; 4. Não pode conter espaços em branco ou caracteres de formatação; 16712855225
Conforme vimos em aula, “tres3” é um nome válido, mas “3tres” não! Gabarito: C 34. (FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - e de Web A tecnologia Java é, basicamente, dividida em JSE, a) JEE e JME. b) JEE e JPE. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 119 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
c) JDE e JME. d) JDE e JPE. e) JEEP e JME. Comentários: Java Standard Edition (Java SE): trata-se de uma ferramenta de desenvolvimento para a Plataforma Java. Ela contém todo o ambiente necessário para a criação e execução de aplicações Java, incluindo a Máquina Virtual (JVM), Compilador (Javac), Bibliotecas (APIs), entre outras ferramentas. Em geral, rodam em computadores pessoais, notebooks, etc. Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de sistemas corporativos, voltada para aplicações multicamadas, baseadas em componentes executados em servidores de aplicações – ele inclui o Java SE. Contém bibliotecas para o a base de dados, RPC, CORBA, entre outras. As aplicações podem ou não estar na internet. Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. Conforme vimos em aula, esses são os mais importantes mesmo! Gabarito: A (FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação Uma classe Java pode ser instanciada por um comando, cuja sintaxe é: 16712855225
a) nome_Objeto nome_Classe = new nome_Objeto(); b) nome_Classe nome_Objeto = new nome_Classe(); c) nome_Classe nome_instancia = new nome_Objeto(); d) nome_Instancia nome_Objeto = new nome_Instancia(); e) nome_Instancia nome_Classe = new nome_Instancia(); Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 120 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 /* 1) Operador NEW é responsável por criar um objeto; * 2) NomeClasse() é o construtor da Classe NomeClasse; * 3) NomeObjeto é uma variável do Tipo NomeClasse; */ NomeClasse NomeObjeto = new NomeClasse(); /* Observem que é possível atribuir o objeto de uma * classe para uma variável de outra classe */
Conforme vimos em aula, trata-se da segunda opção! Gabarito: B (FCC - 2005 - TRE-MG - Programador de computador Os erros gerados durante a execução de um programa Java devem ser controlados com uma estrutura que pode combinar o uso dos blocos: a) try e finally, somente. b) try e catch ou try e finally, somente. c) try, catch e finally, somente. d) try e catch, somente. e) try e catch, try e finally ou try, catch e finally. Comentários: try { //Não vem sozinho: try/catch, try/finally ou try/catch/finally //Código a ser executado } catch (ClasseDeExceção objDaExceção) { //Não vem sozinho: try/catch ou try/catch/finally //Tratamento da exceção } finally { //Não vem sozinho: try/finally ou try/catch/finally. //Código a ser executado mesmo que uma exceção seja lançada }
16712855225
Conforme vimos em aula, as combinações possíveis são try/catch, try/finally e try/catch/finally. Gabarito: E ACERTEI
Prof. Diego Carvalho
ERREI
www.estrategiaconcursos.com.br
Pág. 121 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(FUNCAB - 2010 - PRODAMSeja a seguinte classe Java:
- Analista de TI - Desenvolvimento de Sistemas
<mod> public class Xpto { } Qual das alternativas a seguir contém um modificador que ao ser usado na declaração acima em substituição ao termo <mod> impedirá que a classe Xpto seja estendida? a) static b) const c) abstract d) final e) virtual Comentários: //Essa classe não pode ser estendida final class Carro {...} 16712855225
Conforme vimos em aula, trata-se do Final. Gabarito: D (ESAF - 2012 - Receita Federal - Analista Tributário da Receita Federal - Prova 2 - Área Informática Em programação Java, o comando while: a) executa um bloco exclusivamente de comandos de atribuição. b) executa um bloco de comandos enquanto sua condição for verdadeira. c) executa um bloco de comandos até que sua condição seja verdadeira. d) equivale ao comando what-if. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 122 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
e) é idêntico ao comando do while. Comentários: (a) Não, podem ter outros comandos – não é só atribuição; (b) Perfeito, enquanto for verdadeira, continua a iteração; (c) Não, enquanto ela for verdadeira; (d) Não, esse comando não existe; (e) Não, esse comando entra no bloco e só depois avalia a condição. Gabarito: B (CONSULPLAN – – Prefeitura de Natal – Analista de Sistemas) Analise as afirmativas abaixo colocando V para as afirmativas Verdadeiras e F para as Falsas. A linguagem JAVA se divide nas seguintes edições: ( ) J2SE (Java 2 Standard Edition) - tecnologia Java para computadores pessoais, notebooks e arquiteturas com poder de processamento e memória consideráveis. ( ) J2EE (Java 2 Enterprise Edition) - tecnologia Java para aplicações corporativas que podem estar na internet ou não. ( ) J2ME (Java 2 Micro Edition) - tecnologia Java para dispositivos móveis com limitações de memória ou processamento. ( ) J2FE (Java 2 Full Edition) - tecnologia Java para aplicações em computadores de grande porte (mainframe). A seqüência está correta em:
16712855225
a) F, F, F, F b) V, V, V, F c) V, F, F, V d) F, V, F, V e) V, V, V, V Comentários: Java Standard Edition (Java SE): trata-se de uma ferramenta de desenvolvimento para a Plataforma Java. Ela contém todo o ambiente necessário para a criação e Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 123 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
execução de aplicações Java, incluindo a Máquina Virtual (JVM), Compilador (Javac), Bibliotecas (APIs), entre outras ferramentas. Em geral, rodam em computadores pessoais, notebooks, etc. Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de sistemas corporativos, voltada para aplicações multicamadas, baseadas em componentes executados em servidores de aplicações – ele inclui o Java SE. Contém bibliotecas para o a base de dados, RPC, CORBA, entre outras. As aplicações podem ou não estar na internet. Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. Conforme vimos em aula, as três primeiras alternativas estão perfeitas; a última simplesmente não existe. Gabarito: B (Instituto Cidades - 2012 - TCM-GO - Auditor de Controle Externo - Informática Analise: I. O Java refere-se tanto a uma linguagem de programação quanto a uma plataforma; II. O Java SE (Standard Edition) é formalmente chamado de J2SE; 16712855225
III. O J2EE é a edição corporativa do Java. Esta versão inclui o Java Standard Edition além de outras tecnologias como javamail, servlets, JSF e Enterprise Java Beans. IV. O Java possui uma versão para dispositivos móveis chamada J2ME (Micro Edition). São verdadeiras as afirmações: a) I, II e IV, somente; b) I, III e IV, somente; Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 124 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
c) II, III e IV, somente; d) I e IV, somente; e) Todas as afirmações. Comentários: Java é tanto uma plataforma quanto uma linguagem de programação orientada a objetos que permite o desenvolvimento de aplicações em diversas plataformas diferentes. Como já foi dito anteriormente, Java está presente desde dispositivos pequenos (Smartphone, Tablet, etc) a máquinas de grande porte (Servidores, Mainframes, etc). A linguagem Java possui quatro ambientes de desenvolvimento: (a) Conforme vimos em aula, é tanto uma linguagem quanto uma plataforma; Java Standard Edition (Java SE): trata-se de uma ferramenta de desenvolvimento para a Plataforma Java. Ela contém todo o ambiente necessário para a criação e execução de aplicações Java, incluindo a Máquina Virtual (JVM), Compilador (Javac), Bibliotecas (APIs), entre outras ferramentas. Em geral, rodam em computadores pessoais, notebooks, etc. (b) Conforme vimos em aula, é o nome antigo de Java SE; Java Enterprise Edition (Java EE): trata-se do padrão para desenvolvimento de sistemas corporativos, voltada para aplicações multicamadas, baseadas em componentes executados em servidores de aplicações – ele inclui o Java SE. Contém bibliotecas para o a base de dados, RPC, CORBA, entre outras. As aplicações podem ou não estar na internet. (c) Conforme vimos em aula, é exatamente isso; 16712855225
Java Micro Edition (Java ME): trata-se do padrão aplicado a dispositivos compactos ou móveis, como smartphones, tablets, controles remotos, etc. Permite o desenvolvimento de softwares embarcados, i.e., aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa útil. Em geral, possuem limitações de recursos como memória ou processamento. (d) Conforme vimos em aula, é o Java ME (nome atual). Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 125 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(UFBA - 2012 - UFBA - Técnico de Tecnologia da Informação O código-fonte de um programa de computador escrito na linguagem Java, é compilado para um formato intermediário conhecido como bytecode. Comentários: Java é também uma linguagem portável e multiplataforma! O Compilador é capaz de gerar um código intermediário (bytecode), que permite que o mesmo programa possa ser executado em qualquer máquina ou sistema operacional que possua uma JVM. Ademais, busca que todos os aspectos da linguagem sejam independentes de plataforma (Ex: ela especifica o tamanho e comportamento de cada tipo de dado). Conforme vimos em aula, a questão está perfeita! No entanto, há uma coisa muito errada nessa questão! O que, professor? Não se separa sujeito do predicado com vírgula! Jamais... Vacilo, UFBA! ;-) Gabarito: C (PaqTB - 2012 - UEPB - Técnico em Informática - Programador) Em Java, um bloco de código é: a) Tudo que está entre ( ) b) Tudo que está entre { } c) Tudo que está entre [ ] d) Tudo que está entre < > e) Tudo que está no mesmo nível de indentação. Comentários: 16712855225
Blocos de programação são aglomerados de instruções e declarações que têm escopo conjunto. Em outras palavras, as variáveis definidas como locais dentro de um bloco somente serão presentes dentro deste bloco, assim como as instruções ali presentes. Os blocos de programação são delimitados por chaves { } e podem ser aninhados, já os comandos sempre são terminados com ponto-e-vírgula. Conforme vimos em aula, bloco de código vem delimitado por chaves { }. Gabarito: B
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 126 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(CESGRANRIO - 2012 - Petrobrás - Técnico de Exploração de Petróleo Júnior Informática Ao escrever o código da Classe PortaDeCofre em Java para que ela atenda a interface Porta, como um programador deve começar a declaração da classe? a) public class Porta:PortaDeCofre { b) public class PortaDeCofre :: Porta { c) public class PortaDeCofre inherits Porta { d) public class PortaDeCofre extends Porta { e) public class PortaDeCofre implements Porta { Comentários: A sintaxe para implementar uma Interface utiliza a palavra reservada implements: public class Teste implements FiguraGeometrica
Conforme vimos em aula, utilizamos a palavra-reservada implements. Gabarito: E (PaqTB - 2012 - UEPB - Técnico em Informática - Programador Em linguagem de programação, um identificador é o nome que utilizamos para representar variáveis, classes, objetos. etc. Em Java, qual dos itens abaixo não é um identificador válido? a) falso b) true c) maior_valor d) Mp10 e) xBACON
16712855225
Comentários: 1. Não pode ser uma palavra-reservada (palavra-chave); Não pode ser true false ou null; 3. Não pode começar com números; 4. Não pode conter espaços em branco ou caracteres de formatação; Conforme vimos em aula, não se pode utilizar true.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 127 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Gabarito: B (ESAF - Tecnologia da Informação Com relação a essa característica, é correto afirmar que: a) métodos declarados como public em uma superclasse, quando herdados, precisam ser protected em todas as subclasses dessa classe. b) métodos declarados como protected em uma superclasse, quando herdados, precisam ser protected ou public nas subclasses dessa classe. c) o nível de o protected é mais restritivo do que o nível de o default. d) métodos declarados como public só podem ser ados a partir dos métodos da própria classe ou de classes derivadas. e) métodos declarados como default só podem ser ados a partir dos métodos da própria classe. Comentários: (a) Não, essa afirmação não faz qualquer sentido; (b) Sim, as subclasses nunca podem ser mais restritivas que as superclasses; (c) Não, default é mais restritivo; (d) Não, eles podem ser ados por quaisquer métodos de quaisquer classes ou pacotes; (e) Não, eles podem ser ados pela própria classe, pelas subclasses e pelas classes do mesmo pacote. 16712855225
Gabarito: B
10. (UFBA – UFBA – Analista de Sistemas) O bloco finally em uma instrução try catch finally sempre será executado quer ocorra ou não uma exceção no bloco try. Comentários: Podemos encadear vários blocos catch, dependendo do número de exceções que podem ser lançadas por uma classe ou método. O bloco catch obtém o erro criando uma instância da exceção. Quando uma exceção é lançada e é necessário que determinada ação seja tomada mesmo após a sua captura, utilizamos a palavra reservada finally – é opcional, mas se existir, sempre será executado. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 128 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Conforme vimos em aula, é um bloco opcional. No entanto, caso exista, sempre será executado – com exceção ou não! Gabarito: C 11. (CONSULPLAN - 2007 - Chesf - Analista de Sistemas – I É possível utilizar vários blocos catch para capturar exceções vindas de um único bloco try. Comentários: Podemos encadear vários blocos catch, dependendo do número de exceções que podem ser lançadas por uma classe ou método. O bloco catch obtém o erro criando uma instância da exceção. Quando uma exceção é lançada e é necessário que determinada ação seja tomada mesmo após a sua captura, utilizamos a palavra reservada finally – é opcional, mas se existir, sempre será executado. Conforme vimos em aula, podemos ter vários blocos catch de um único try. Gabarito: C 12. (AO - 2012 - BRDE - Analista de Sistemas - Desenvolvimento de Sistemas Java threads são objetos que podem cooperar e comunicar-se entre si para compartilhar objetos em memória, a tela, ou outros tipos de recursos e periféricos. Comentários: Quando nós executamos essas tarefas em paralelo, estamos usando Threads! Vocês sabem o que essa palavra significa em português? Fios ou Linhas! Em outras palavras, criamos linhas de execução de tarefas paralelas em memória – cada linha responsável por executar alguma coisa simultaneamente e relativamente independentes. Em Java, as Threads são objetos presentes no Pacote java.lang. 16712855225
Conforme vimos em aula, realmente são objetos que representam recursos compartilhados em memória. Gabarito: C
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 129 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
13. (FGV – 2009 – MEC - Analista de Sistemas – D) Swing é um mecanismo simples e consistente para estender a funcionalidade de um servidor web e para ar existentes sistemas de negócio. Comentários: A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes e interfaces que definem os componentes visuais necessários para construir uma interface gráfica de usuário. Conforme vimos em aula, a questão não faz o menor sentido – não tem absolutamente nada a ver com Swing. Gabarito: E 14. (ESAF – – CGU - Analista de Sistemas) A linguagem Java possui uma API (Application Program Interface) que disponibiliza pacotes e classes com diversas funcionalidades para auxiliar no desenvolvimento de aplicações. O pacote que contém classes que auxiliam na criação de interfaces de usuário, incluindo tratamento de gráficos e imagens, é denominado: a) java.util. b) java.applet. c) java.graphic. d) java.image. e) java.awt. 16712855225
Comentários: A Plataforma Java oferece recursos para construção de interfaces gráficas de usuário (GUI), entre eles: AWT (java.awt) e Swing (javax.swing)! O primeiro é um conjunto básico de classes e interfaces que definem os componentes de uma janela desktop. Já o Swing é um conjunto sofisticado de classes e interfaces que definem os componentes visuais necessários para construir uma interface gráfica de usuário. Conforme vimos em aula, trata-se do pacote java.awt. Gabarito: E Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 130 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
15. (FGV – 2015 – PGE/RO – Analista de Sistemas) Na linguagem de programação Java, para indicar que uma classe A é derivada de B, utiliza-se, na declaração de A, o modificador: a) imports; b) extends; c) inherits; d) subclass; e) superclass. Comentários: A palavra-chave extends faz com que uma subclasse herde (receba) todos os atributos e métodos declarados na classe-pai (desde que ela não seja final), incluindo todas as classes-pai da classe-pai. A classe-filha pode ar todos os atributos e métodos não-privados. Ela herda, mas não a (ao menos diretamente) métodos e atributos privados. Conforme vimos em aula, trata-se do extends. Gabarito: B 16. (FGV – 2015 – PGE/RO – Analista de Sistemas) São tipos primitivos na linguagem de programação Java: a) int, float, double, char, boolean; b) int, double, string, char, boolean; c) integer, real, byte, char, boolean; d) byte, word, short, integer, char; e) int, real, char, string, boolean.
16712855225
Comentários: Vamos falar agora sobre uma das linguagens mais famosas do mundo! Professor, o que é Java? É uma linguagem de programação orientada a objetos, multiplataforma, robusta, portável, segura, extensível, concorrente e distribuída. E ela é totalmente orientada a objetos? Não! Por que não? Porque nem todos os seus tipos de dados são objetos (possui alguns tipos primitivos: int, float, long, double, char, etc).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 131 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Conforme vimos em aula, trata-se do int, float, double, char e boolean. Gabarito: A 17. (FGV – 2014 – TJ/GO – Analista de Sistemas) Se uma classe na linguagem Java é declarada com o modificador abstract, então essa classe: a) não pode ser referenciada; b) não pode ser estendida; c) não pode ser instanciada; d) pode ser instanciada apenas uma vez; e) não pode possuir métodos estáticos. Comentários:
Palavras abstract
Descrição Aplicado a um método ou classe indica que a implementação completa deste método ou classe é efetuada posteriormente, por uma subclasse. Caso seja uma classe, significa que ela não pode ser instanciada.
Conforme vimos em aula, ela não pode ser instanciada. Gabarito: C 18. (FGV – 2014 – /GO – Analista de Sistemas) Na linguagem de programação Java, uma classe declarada com o modificador final: a) não pode ser instanciada; b) não pode ser estendida; c) pode ter o modificador abstract também presente na declaração; d) não pode ter métodos estáticos; e) não pode ter métodos de instância. 16712855225
Comentários: Portanto para declarar uma classe, deve-se colocar a palavra class seguida de um identificador que irá servir de nome para a classe. O identificador pode ser qualquer palavra, exceto palavras reservadas. Por exemplo: class Conta introduz a declaração
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 132 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
de uma nova classe chamada Conta. Note que, por convenção, o nome de uma classe inicia sempre com uma letra maiúscula. A Palavra-Chave é opcional, podendo ser: //Essa classe pode ser ada por todos public class Carro {...} //Essa classe não pode gerar instâncias abstract class Carro {...} //Essa classe não pode ser estendida final class Carro {...}
Conforme vimos em aula, ela não pode ser instanciada. Gabarito: B 19. (FGV – 2010 – BADESC – Analista de Sistemas) Observe o código em Java a seguir, em que se pode verificar a aplicação dos operadores de pré-decremento e pós-decremento. public class Decrementa { public static void main (string args {} ) { int m, n = 44; m = --n; m = n--; system.out.println (m); system.out.println (n); }
} Após a execução do código, as variáveis m e n exibirão, respectivamente, os valores: 16712855225
a) 42 e 41. b) 42 e 42. c) 42 e 43. d) 43 e 42. e) 43 e 43. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 133 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Vamos analisar essa questão! O examinador queria saber se o aluno conhecia os operadores de pré-incremento e os operadores de pós-incremento. Observem que na linha 5, temos um operador de pré-incremento. Isso significa que a m será atribuído o valor de n-1, ou seja, 43. Ao final dessa linha, m = n = 43. Na linha 6, temos um operador de pós-incremento. Isso significa que a m será atribuído o valor de n, ou seja, 43 e só depois será feita a operação, i.e., m = 43, mas ao final dessa linha, n = 42. Então, temos m = 43 e n = 42. Agora o engraçado é que nada isso será executado porque o comando não é system.out, mas System.out, mas a questão ignorou esse errinho. Gabarito: D (FGV – 2015 – TJ/BA – Analista de Sistemas) Em Java, os métodos declarados sem modificadores em uma interface são implicitamente: a) públicos e estáticos; b) públicos e abstratos; c) privados e estáticos; d) públicos e finais; e) privados e abstratos. Comentários: Galera, se o método é declarado sem modificador dentro de uma interface, então ele é implicitamente público e evidentemente abstrato. Gabarito: B ACERTEI
Prof. Diego Carvalho
16712855225
www.estrategiaconcursos.com.br
ERREI
Pág. 134 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
LISTA DE EXERCÍCIOS COMENTADOS (CESPE) JAVA SE (CESPE - 2013 - SERPRO - Analista - Desenvolvimento de Sistemas Garbage Collector é a tecnologia que gerencia a memória alocada para o programa, a fim de liberar objetos que não estão sendo utilizados. (CESPE - 2012 - TRE-RJ - Técnico Judiciário - Programação de Sistemas A linguagem de programação Java é muito utilizada por ter como característica gerar um código independente de plataforma que pode ser executado em qualquer arquitetura e sistema operacional que tenha o sistema Java. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas No Java, a JRE possui tudo que é necessário para desenvolver programas em Java. (CESPE - 201 - Banco da Amazônia - Técnico Científico - Análise de Sistemas Em Java, para toda classe, método e variável de instância que se declara há um controle de o, independentemente de o controle ser explicitamente indicado. (CESPE - 2012 - Banco da Amazônia - Técnico Científico - Análise de Sistemas O operador instanceof só pode ser usado para testar valores null. (CESPE - 2012 - MPE-PI - Analista Ministerial - Informática - Cargo 6 Em Java, qualquer método de uma classe pode ser sobrescrito por métodos de outra classe. 16712855225
(CESPE - 2011 - -ES - Técnico de Informática - Específicos) O JVM (Java Virtual Machine) é um interpretador que atribui portabilidade à linguagem Java, possibilitando, consequentemente, a sua execução em qualquer sistema operacional. (CESPE - 2011 - TRE-ES - Técnico - Programação de Sistemas – Específicos O encapsulamento em Java somente pode ser realizado por meio do modificador de o protegido.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 135 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(CESPE - 2010 - TRT - 21ª Região (RN) - Técnico Judiciário - Tecnologia da Informação A linguagem de programação Java, em razão de sua portabilidade — uma vez que o compilador Java converte o código fonte em bytecodes, executados por uma máquina virtual — é bastante utilizada para oferecer conteúdos dinâmicos na Web. 10. (CESPE - 2010 - T -BA - Técnico Judiciário - Programação de Sistemas Em programação orientada a objetos, o pacote tem como função agrupar classes dentro de um grupo. Em Java, o pacote Swing (javax.swing) é composto de várias classes para a implementação de interfaces gráficas em desktop. 11. (CESPE - ANAC - Analista istrativo - Tecnologia da Informação Pelo uso de polimorfismo, uma chamada de método pode fazer que diferentes ações ocorram, dependendo do tipo do objeto que recebe a chamada. 12. (CESPE - 2010 - EMBAS - Analista de Saneamento - Analista de Tecnologia da Informação - Desenvolvimento O trecho de código a seguir está incorreto porque uma variável booleana em Java usa a sintaxe == e não =. Public void disconnect() { Connected = false; } 13. (CESPE - TRE-MA - Técnico Judiciário - Programação de Sistemas) Para definição e manipulação de uma exceção em Java, devem constar no programa, obrigatoriamente, os termos: a) try e catch. b) try e finally. c) finally e catch. d) finally e retry. e) try e retry.
16712855225
14. (CESPE - 2009 - TRT - 17ª Região (ES) - Técnico Judiciário - Tecnologia da Informação Ao contrário dos tipos primitivos que não são objetos, os tipos de objetos são determinados pela classe de origem. 15. (CESPE - 2009 - TRT - 17ª Região (ES) - Técnico Judiciário - Tecnologia da Informação Uma classe final indica uma classe que não pode ser estendida. Um método final não pode ser redefinido em classes derivadas. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 136 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
16. (CESPE - SERPRO - Analista - Desenvolvimento de Sistemas A linguagem Java, orientada a objetos, tem como característica ser compilada em um código executado em máquina virtual. 17. (CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação A instrução import Java.awt.* indica que o programa irá utilizar componentes gráficos. 18. (CESPE - TRT - 5ª Região (BA) - Técnico Judiciário - Tecnologia da Informação Em Java, os métodos public de uma classe são utilizados pelos clientes da classe para manipular dados armazenados em objetos dessa classe. 19. (CESPE - 2013 - SERPR - Analista - Desenvolvimento de Sistemas) A tecnologia JSE (Java Small Editon) utilizada pela plataforma iOS permite o desenvolvimento de aplicações para todos os seus dispositivos, como estações gráficas, iPad, iPod, entre outros. (CESPE - 2013 - MPOG - Tecnologia da Informação O JME foi criado para trabalhar com ambientes de programação multiprocessados em ambientes distribuídos. 21. (CESPE - 2013 - ANTT - Analista istrativo - Desenvolvimento de Sistemas da Informação JSE, JME, JEE e JCE são edições da tecnologia Java voltadas para o desenvolvimento de aplicações para desktop/servidores, dispositivos móveis, ambientes corporativos e ambientes em nuvem, respectivamente. (CESPE - HEMOBRÁS - Técnico de Informática O Java dá e a programação concorrente (multithreading). 16712855225
(CESPE - ANAC - Técnico istrativo - Informática) A linguagem de programação Java permite operações de bit, como, por exemplo, AND (&) e OR (|). 24. (CESPE - 2010 - MPU - Técnico de Informática Na linguagem Java, um objeto do tipo Integer pode receber valor nulo, porém uma variável primitiva int não pode. (CESPE - 2013 - TRT - 10ª REGIÃO (DF e TO) - Técnico Judiciário - Tecnologia da Informação É possível indicar que parte de um código em um método pode gerar uma exceção, por meio da utilização da palavra-chave finally. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 137 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(CESPE - 2014 - ANATEL - Analista istrativo - Tecnologia da Informação e Comunicação) A linguagem Java possui checked exceptions que estendem java.lang.Exception, em que o compilador força o programador a capturar tais exceções. Essas exceções devem ser tratadas com um bloco try-catch ou com um throws. 27. (CESPE – 2004 – STJ - Analista Judiciário - Análise de Sistemas) O Java collections framework da API Java J2SE possui um conjunto de interfaces e implementações que define estruturas usadas para manipular coleções de objetos. As interfaces fundamentais do framework estão associadas à identificação de funcionalidades típicas de estruturas de dados clássicas. Assim, a interface java.util.List está ligada a estruturas de listas, a interface java.util.Set está associada a estruturas do tipo conjuntos e a interface java.util.Map refere-se a estruturas do tipo mapas. Set, List e Map possuem a interface abstrata java.util.Collection como superinterface. (CESPE – 2004 – STJ - Analista Judiciário - Análise de Sistemas) As classes java.util.LinkedList e java.util.ArrayList são implementações para listas encadeadas e coleções do tipo arranjos com tamanho modificável, respectivamente, para a interface java.util.List. (CESPE – – ANCINE – Analista de Sistemas) Os tipos de dados HashSet, ArrayList e HashMap são classes que implementam os tipos de dados Set, List e Map, respectivamente. (CESPE – – SGA/AC – Analista de Sistemas – C ArrayList implementa a interface List e Collection. 31. (CESPE – 2008 – MPE/RR - Analista de Sistemas) O pacote java.awt contém diversas classes para criar interfaces gráficas de usuário em aplicações Java. 16712855225
(CESPE – – MPE/RR - Analista de Sistemas) No AWT, um componente é qualquer classe que possa ser representada em uma tela sem interação com usuário. (CESPE – – MPE/RR - Analista de Sistemas) O Swing a o desenvolvimento de interfaces gráficas para usuários (GUI) com o uso da IDE NetBeans
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 138 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
34. (CESPE – 2011 – MEC - Analista de Sistemas) AWT é um conjunto de componentes GUI, integrante da arquitetura JEE6, constante no pacote java.awt, desenvolvidas para substituir as GUIs do SWING. (CESPE – 2015 – TCU - Analista de Sistemas) No contexto de um código na linguagem Java, o comando a seguir é utilizado com a finalidade específica de ar para o campo de visibilidade pública saldo o valor da variável deposito com o tipo double. public void saldo (double deposito). (CESPE – 2014 – ANATEL - Analista de Sistemas) No JSE (Java Standard Edition) versão 8, é possível utilizar recursos inerentes à programação funcional por meio de uma nova característica da linguagem chamada expressões Lambda, que permitem o tratamento de funções como argumentos de métodos.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 139 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
LISTA DE EXERCÍCIOS COMENTADOS (FCC) JAVA SE (FCC - 2011 - TRE-RN - Técnico Judiciário - Programação de Sistemas Em relação ao Java Standard Edition, é INCORRETO afirmar: a) Possui gerenciamento de memória embutido, por meio do coletor de lixo. b) Ambiente indicado para o desenvolvimento de aplicativos para dispositivos móveis ou portáteis. c) Permite o desenvolvimento de aplicações desktop de linha de comando e interfaces gráficas Swing. d) Portabilidade dos programas compilados para diversos sistemas operacionais, sem necessidade de recompilação. e) Usa conceitos tais como orientação a objetos e multithreading. (FCC - 2010 - TRT - 22ª Região (PI) - Técnico Judiciário - Tecnologia da Informação A plataforma Java disponibiliza um interpretador que traduz, em tempo de execução, o bytecode para instruções nativas do processador, permitindo, dessa forma, que uma mesma aplicação seja executada em qualquer plataforma computacional que possua essa implementação. Trata-se de: a) Java Virtual Machine. b) Java API. c) JavaBeans. d) J2SE. e) JavaFX.
16712855225
(FCC - 2010 - Sergipe Gás S.A. - Analista de Sistemas É tida como uma das principais linguagens de programação orientada a objeto; tem como característica a compilação para um bytecode e execução por uma máquina virtual. Trata-se da linguagem: a) Algol. b) Delphi.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 140 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
c) C++. d) Java. e) PHP. (FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - e de Web Os aplicativos Java “rodam” em diferentes ambientes. A tradução dos códigos Java (bytecode), para instruções específicas de cada sistema e dispositivo, é uma função do programa: a) Java Community Process (J). b) Java Virtual Module (JVM). c) Java Virtual Machine (JVM). d) Java Comunication Process (J). e) Java Enterprise Machine (JEM). (FCC - -SE - Técnico Judiciário - Programação de Sistemas Um objeto é instanciado em Java por meio do operador: a) instanceof. b) extend. c) new. d) this. e) type. (FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação Uma classe Java pode ser instanciada por um comando, cuja sintaxe é: a) nome_Objeto nome_Classe = new nome_Objeto(); b) nome_Classe nome_Objeto = new nome_Classe(); c) nome_Classe nome_instancia = new nome_Objeto(); d) nome_Instancia nome_Objeto = new nome_Instancia(); e) nome_Instancia nome_Classe = new nome_Instancia(); 16712855225
(FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação A diretiva public é utilizada em Java para aplicar a encapsulação pública: a) aos métodos e classes, apenas. b) aos atributos, métodos e classes. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 141 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
c) às classes, apenas. d) aos atributos, apenas. e) aos atributos e classes, apenas. (FCC - 2008 - TCE-AL - Programador Em Java, para alterar a visibilidade do elemento em que se aplica, entre outros, utiliza-se o modificador de o: a) static. b) abstract. c) protected. d) volatile. e) transient. (FCC - 2007 - MPU - Analista de Informática - Desenvolvimento de Sistemas Analise os seguintes valores, variáveis e operações usando expressões Java: byte j = 30; short k = 54; int m = 40; long n = 12L; long resultado = 0L; resultado += j; resultado += k; resultado /= n; resultado -= m; Após a última operação, o resultado será igual a: a) -7. b) -32. c) -33. d) 60. e) 84.
16712855225
10. (FCC - TRE-MG - Técnico Judiciário - Programação de Sistemas Os métodos Java que não retornam valores devem possuir no parâmetro tipo-deretorno a palavra: a) static. b) public. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 142 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
c) void. d) main. e) string args. 11. (FCC - 2012 - TST - Analista Judiciário - Análise de Sistemas) Considere o programa abaixo escrito na linguagem Java:
O resultado a ser informado ao usuário após a execução do programa acima é: a) 0 0 1 0 0 1 0 0 1 b) 0 1 2 0 1 2 0 1 2 c) 0 1 0 1 0 1 0 1 0 d) 1 2 1 2 1 2 1 2 1 e) 0 2 1 0 2 1 0 2 1 E-AP - Analista Ministerial - Tecnologia da Informação Analise 12. (FCC - 2012 o código das classes a seguir presentes em um mesmo pacote de um projeto Java:
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 143 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
Com base nos códigos apresentados e nos conceitos da orientação a objetos é correto afirmar: a) No método main da classe Start não é possível instanciar objetos das classes NewClassA e NewClassB, pois essas classes não contêm um construtor válido. b) Se for digitada a instrução NewClassB c = new NewClassA(); no método main da classe Start será instanciado um objeto da NewClassA. c) Se for digitada a instrução NewClassA b = new NewClassB(); no método main da classe Start ocorrerá um erro, pois não é possível criar um objeto da NewClassA por meio do construtor da NewClassB. d) A existência de dois métodos de mesmo nome na NewClassA que recebem a mesma quantidade de parâmetros indica que está ocorrendo uma sobrescrita de métodos. e) Por meio de um objeto da NewClassB será possível ar os métodos presentes na NewClassA. 13. (FCC - 2012 - TCE- - Auxiliar de Fiscalização Financeira Em um programa Java, considere a existência de uma variável do tipo long chamada cod contendo o valor 1234. Para ar o valor contido nessa variável para uma variável do tipo byte chamada codNovo, deve-se fazer casting. Para isso, utiliza-se a instrução: byte codNovo = a) Byte.valueOf(cod); b) (long) cod; c) Byte.pasreByte(cod); d) (byte) cod; e) (cast) cod;
16712855225
14. (FCC - 2012 - TRE- Técnico Judiciário - Programação de Sistemas Para chamar o método soma da classe Calculo, e mostrar na tela o retorno desse método, é correto utilizar:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 144 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
a) Calculo c = new Calculo(); System.out.println (c.soma(10, 20, 30)); ou System.out.println (Calculo.soma(10, 20)); b) Exclusivamente as instruções Calculo c = new Calculo(); System.out.println (c.soma(10, 20)); c) Exclusivamente a instrução System.out.println (Calculo.soma(10, 20, 50)); d) Exclusivamente as instruções Calculo c = new Calculo(); double r = c.soma(10, 20); System.out.println(r); e) Calculo c = Calculo.soma(10,20,30); System.out.println (Calculo.soma(10, 20));
System.out.println
(c);
ou
15. (FCC - 2012 - TRE- Técnico Judiciário - Programação de Sistemas Com relação a herança na programação orientada a objetos com Java, é INCORRETO afirmar: a) Uma subclasse herda os métodos da superclasse, entretanto, pode ter seus próprios métodos. b) Quando se instancia um objeto da subclasse, podem ser ados valores para os atributos da superclasse. 16712855225
c) Um objeto da subclasse pode ser um objeto da superclasse. d) Em uma superclasse, para ar métodos da subclasse deve ser usada a instrução super. e) Para definir que a subclasse herda as características da superclasse utiliza-se a instrução extends na declaração da subclasse.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 145 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
16. (FCC - 2011 - TRT - 4ª REGIÃO (RS) - Técnico Judiciário - Tecnologia da Informação No ambiente de programação Java: a) uma classe abstrata permite apenas métodos abstratos. b) o corpo de um método abstrato termina com ponto e vírgula e a declaração é delimitada por chaves. c) uma interface pode definir tanto métodos abstratos quanto não abstratos. d) a herança múltipla permite que mais classes sejam estendidas. e) toda classe é uma subclasse direta ou indireta da classe Object. 17. (FCC - 2010 - TRT - 8ª Região (PA e AP) - Analista Judiciário - Tecnologia da Informação São tipos primitivos da linguagem Java: a) int, string, long e real. b) char, int, real e bit. c) boolean, double, float e byte. d) real, short, long e char. e) string, long int, short int e float. 18. (FCC - 2010 - - - Agente Legislativo de Serviços Técnicos e istrativos - Processamento de Dados Os tipos de dados primitivos em Java são: a) char, boolean, byte, short, int, long, float e double. b) char, boolean, byte, short, int, long, float, double e String. c) byte, short, int, long, float e double. d) byte, short, int, long, float, double, String e Date. e) char, boolean, byte, short, int, long, float, double, String e Date. 19. (FCC - 2009 - TRT - 15ª Região - Analista Judiciário - Tecnologia da Informação No âmbito da linguagem Java, considere: 16712855225
I. Edição é a criação do programa, que também é chamado de código Bytecode. II. Compilação é a geração de um código intermediário chamado fonte, que é um código independente de plataforma. III. Na interpretação, a máquina virtual Java ou JVM analisa e executa cada instrução do código Bytecode.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 146 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
IV. Na linguagem Java a interpretação ocorre apenas uma vez e a compilação ocorre a cada vez que o programa é executado. Está correto o que consta em: a) I, II, III e IV. b) II e IV, somente. c) III e IV, somente. d) IV, somente. e) III, somente. (FCC - 2008 - TCE-AL - Programador Os três elementos básicos quando contidos num arquivo fonte Java devem obrigatoriamente se apresentar na seguinte ordem: a) import, package e class. b) class, package e import. c) class, import e package. d) package, class e import. e) package, import e class. 21. (FCC - 2014 – TRF/3 – Analista de Sistemas Considere a classe escrita em Java:
16712855225
O valor que será impresso na execução do método main é: a) 6.0 b) 7 c) 8.0 Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 147 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
d) 5.0 e) 12.5 (FCC - TCE-AL - Programador Considerando que as variáveis Java X, Y e Z foram todas inicializadas com zero, os resultados das mesmas após as alterações realizadas pelas atribuições X *= 2, Y -= 5 e Z /=3, respectivamente, serão: a) 0, -5 e 0 b) 0, 5 e 0 c) 1, -5 e 3 d) 2, -5 e 3 e) 2, 5 e 3 (FCC - 2008 - MPE-RS - Técnico em Informática - Área Sistemas A função Java: public boolean VerificarF (string F); representa um exemplo do conceito de: a) override. b) overload. c) herança. d) encapsulamento. e) polimorfismo. 24. (FCC - 2007 - MPU - Analista de Informática - Desenvolvimento de Sistemas Quanto às variáveis Java, um inteiro de 64 bits em notação de complemento de dois que pode assumir valores entre -263 e 263 -1 é: 16712855225
a) long. b) short. c) float. d) byte. e) double. (FCC - 2005 - TRE-MG - Técnico Judiciário - Programação de Sistemas A seqüência de etapas para implementação de um programa Java é: a) interpretação, codificação, execução e compilação. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 148 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
b) codificação, interpretação, compilação e execução. c) interpretação, codificação, compilação e execução. d) codificação, compilação, interpretação e execução. e) compilação, codificação, execução e interpretação. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas Considere a variável idade declarada no método main de uma classe Java, com a seguinte instrução: int idade=12; Analise: I. System.out.println (idade<18?"Menor de idade":"Maior de idade"); II. if(idade<18) {System.out.println("Menor {System.out.println("Maior de idade");}
de
idade");}
else
III. if(idade<18) {System.out.println("Menor de idade");} else if (idade>=18) {System.out.println("Maior de idade");} IV. switch(idade) {case<18: System.out.println("Menor de idade"); break; case>=18: System.out.println("Maior de idade");} Contém uma instrução correta que exibirá na tela a frase "Menor de idade": a) I, II, III e IV. b) I, II e III, apenas. c) II e III, apenas. d) II, apenas. e) I e III, apenas.
16712855225
27. (FCC - 2012 - TRE- - Técnico Judiciário - Programação de Sistemas) Considere a estrutura de repetição seguinte:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 149 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
A saída na tela será: a) 15 e 6. b) 1 e 5. c) 0 e 1. d) 6 e 9. e) 9 e 7. (FCC - 2011 - TRE-AP - Técnico Judiciário - Programação de Sistemas Em relação à plataforma de desenvolvimento JSE, considere: I. Possibilita o desenvolvimento de aplicações desktop através de linha de comando e através da interface gráfica Swing. II. É multiplataforma: permite a portabilidade dos programas compilados para diversos sistemas operacionais, sem necessidade de alteração do código ou de recompilação. III. Faz uso explícito de ponteiros e usa conceitos modernos, tais como, orientação a objetos e e a multithreading. IV. Possui o gerenciamento de memória embutido, por meio do garbage collector. 16712855225
Está correto o que se afirmar em: a) I, II e III, somente. b) I, II e IV, somente. c) I, III e IV, somente. d) II, III e IV, somente. e) I, II, III e IV. (FCC - 2011 - INFRAERO - Analista de Sistemas - Desenvolvimento e Manutenção No Java, um tipo inteiro (int) utiliza quatro bytes para
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 150 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
armazenamento. A faixa máxima possível de valores inteiros para se armazenar em uma variável do tipo primitivo int é de: a) -8388608 a 8388607. b) -128 a 127. c) -32768 a 32767. d) -9223372036854775808 a 9223372036854775807. e) -2147483648 a 2147483647. (FCC - 2010 - TRT - 9ª REGIÃO (PR) - Técnico Judiciário - Tecnologia da Informação O JVM mais o núcleo de classes da plataforma Java e os arquivos de e formam o: a) o J2EE. b) o JDK. c) o JRE. d) uma JSP. e) uma API. 31. (FCC - 2014 - TRT - 16ª REGIÃO (MA) - Analista Judiciário - Tecnologia da Informação Considere as classes a seguir, presentes em uma aplicação Java orientada a objetos:
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 151 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
16712855225
Em uma classe principal foram digitadas, no interior do método main, as seguintes linhas:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 152 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
As linhas que contêm a instrução s = f.calcularSalario( ); demonstram um conceito da orientação a objetos conhecido como: a) encapsulamento. b) sobrecarga de métodos. c) polimorfismo. d) sobrescrita de construtores. e) métodos abstratos. (FCC - 2010 - - - Agente Legislativo de Serviços Técnicos e istrativos - Processamento de Dados Métodos estáticos em Java são aqueles que: a) realizam alguma tarefa que é dependente do conteúdo de algum objeto. b) não podem ser ados diretamente pelo nome da classe a que pertencem, mas sim por meio de um objeto da classe. c) realizam alguma tarefa que não é dependente do conteúdo de algum objeto. d) são ados por objetos que não necessitam de ser instanciados explicitamente. e) existem em subclasses de uma herança. (FCC -
- TCE-AL - Programador NÃO são nomes válidos em Java:
a) _Real e $real b) um1 e dois2 c) 3tres e tres3 d) Codigo e codigo e) cod_valor e cod$valor
16712855225
34. (FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - e de Web A tecnologia Java é, basicamente, dividida em JSE, a) JEE e JME. b) JEE e JPE. c) JDE e JME. d) JDE e JPE. e) JEEP e JME. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 153 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação Uma classe Java pode ser instanciada por um comando, cuja sintaxe é: a) nome_Objeto nome_Classe = new nome_Objeto(); b) nome_Classe nome_Objeto = new nome_Classe(); c) nome_Classe nome_instancia = new nome_Objeto(); d) nome_Instancia nome_Objeto = new nome_Instancia(); e) nome_Instancia nome_Classe = new nome_Instancia(); (FCC - TRE-MG - Programador de computador) Os erros gerados durante a execução de um programa Java devem ser controlados com uma estrutura que pode combinar o uso dos blocos: a) try e finally, somente. b) try e catch ou try e finally, somente. c) try, catch e finally, somente. d) try e catch, somente. e) try e catch, try e finally ou try, catch e finally.
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 154 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
LISTA DE EXERCÍCIOS COMENTADOS (DIVERSAS BANCAS) JAVA SE (FUNCAB - 2010 - PRODAMSeja a seguinte classe Java:
- Analista de TI - Desenvolvimento de Sistemas
<mod> public class Xpto { } Qual das alternativas a seguir contém um modificador que ao ser usado na declaração acima em substituição ao termo <mod> impedirá que a classe Xpto seja estendida? a) static b) const c) abstract d) final e) virtual (ESAF - 2012 - Receita Federal - Analista Tributário da Receita Federal - Prova 2 - Área Informática Em programação Java, o comando while: a) executa um bloco exclusivamente de comandos de atribuição. b) executa um bloco de comandos enquanto sua condição for verdadeira. c) executa um bloco de comandos até que sua condição seja verdadeira. d) equivale ao comando what-if. e) é idêntico ao comando do while. 16712855225
(CONSULPLAN – – Prefeitura de Natal – Analista de Sistemas) Analise as afirmativas abaixo colocando V para as afirmativas Verdadeiras e F para as Falsas. A linguagem JAVA se divide nas seguintes edições: ( ) J2SE (Java 2 Standard Edition) - tecnologia Java para computadores pessoais, notebooks e arquiteturas com poder de processamento e memória consideráveis.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 155 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
( ) J2EE (Java 2 Enterprise Edition) - tecnologia Java para aplicações corporativas que podem estar na internet ou não. ( ) J2ME (Java 2 Micro Edition) - tecnologia Java para dispositivos móveis com limitações de memória ou processamento. ( ) J2FE (Java 2 Full Edition) - tecnologia Java para aplicações em computadores de grande porte (mainframe). A seqüência está correta em: a) F, F, F, F b) V, V, V, F c) V, F, F, V d) F, V, F, V e) V, V, V, V (Instituto Cidades - 2012 - TCM-GO - Auditor de Controle Externo - Informática Analise: I. O Java refere-se tanto a uma linguagem de programação quanto a uma plataforma; II. O Java SE (Standard Edition) é formalmente chamado de J2SE; III. O J2EE é a edição corporativa do Java. Esta versão inclui o Java Standard Edition além de outras tecnologias como javamail, servlets, JSF e Enterprise Java Beans. 16712855225
IV. O Java possui uma versão para dispositivos móveis chamada J2ME (Micro Edition). São verdadeiras as afirmações: a) I, II e IV, somente; b) I, III e IV, somente; c) II, III e IV, somente; d) I e IV, somente; e) Todas as afirmações.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 156 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
(UFBA - 2012 - UFBA - Técnico de Tecnologia da Informação O código-fonte de um programa de computador escrito na linguagem Java, é compilado para um formato intermediário conhecido como bytecode. (PaqTB - 2012 - UEPB - Técnico em Informática - Programador) Em Java, um bloco de código é: a) Tudo que está entre ( ) b) Tudo que está entre { } c) Tudo que está entre [ ] d) Tudo que está entre < > e) Tudo que está no mesmo nível de indentação. (CESGRANRIO - 2012 - Petrobrás - Técnico de Exploração de Petróleo Júnior Informática Ao escrever o código da Classe PortaDeCofre em Java para que ela atenda a interface Porta, como um programador deve começar a declaração da classe? a) public class Porta:PortaDeCofre { b) public class PortaDeCofre :: Porta { c) public class PortaDeCofre inherits Porta { d) public class PortaDeCofre extends Porta { e) public class PortaDeCofre implements Porta { (PaqTB - 2012 - UEPB - Técnico em Informática - Programador Em linguagem de programação, um identificador é o nome que utilizamos para representar variáveis, classes, objetos. etc. Em Java, qual dos itens abaixo não é um identificador válido? 16712855225
a) falso b) true c) maior_valor d) Mp10 e) xBACON (ESAF - Tecnologia da Informação Com relação a essa característica, é correto afirmar que: a) métodos declarados como public em uma superclasse, quando herdados, precisam ser protected em todas as subclasses dessa classe. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 157 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
b) métodos declarados como protected em uma superclasse, quando herdados, precisam ser protected ou public nas subclasses dessa classe. c) o nível de o protected é mais restritivo do que o nível de o default. d) métodos declarados como public só podem ser ados a partir dos métodos da própria classe ou de classes derivadas. e) métodos declarados como default só podem ser ados a partir dos métodos da própria classe. 10. (UFBA – UFBA – Analista de Sistemas) O bloco finally em uma instrução try catch finally sempre será executado quer ocorra ou não uma exceção no bloco try. 11. (CONSULPLAN - 2007 - Chesf - Analista de Sistemas – I É possível utilizar vários blocos catch para capturar exceções vindas de um único bloco try. 12. (AO - 2012 - BRDE - Analista de Sistemas - Desenvolvimento de Sistemas - III) Java threads são objetos que podem cooperar e comunicar-se entre si para compartilhar objetos em memória, a tela, ou outros tipos de recursos e periféricos. 13. (FGV – 2009 – MEC - Analista de Sistemas – D) Swing é um mecanismo simples e consistente para estender a funcionalidade de um servidor web e para ar existentes sistemas de negócio. 14. (ESAF – – CGU - Analista de Sistemas) A linguagem Java possui uma API (Application Program Interface) que disponibiliza pacotes e classes com diversas funcionalidades para auxiliar no desenvolvimento de aplicações. O pacote que contém classes que auxiliam na criação de interfaces de usuário, incluindo tratamento de gráficos e imagens, é denominado: 16712855225
a) java.util. b) java.applet. c) java.graphic. d) java.image. e) java.awt.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 158 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
15. (FGV – 2015 – PGE/RO – Analista de Sistemas) Na linguagem de programação Java, para indicar que uma classe A é derivada de B, utiliza-se, na declaração de A, o modificador: a) imports; b) extends; c) inherits; d) subclass; e) superclass. 16. (FGV – 2015 – PGE/RO – Analista de Sistemas) São tipos primitivos na linguagem de programação Java: a) int, float, double, char, boolean; b) int, double, string, char, boolean; c) integer, real, byte, char, boolean; d) byte, word, short, integer, char; e) int, real, char, string, boolean. 17. (FGV – 2014 – TJ/GO – Analista de Sistemas) Se uma classe na linguagem Java é declarada com o modificador abstract, então essa classe: a) não pode ser referenciada; b) não pode ser estendida; c) não pode ser instanciada; d) pode ser instanciada apenas uma vez; e) não pode possuir métodos estáticos. 18. (FGV – 2014 – TJ/GO – Analista de Sistemas) Na linguagem de programação Java, uma classe declarada com o modificador final: 16712855225
a) não pode ser instanciada; b) não pode ser estendida; c) pode ter o modificador abstract também presente na declaração; d) não pode ter métodos estáticos; e) não pode ter métodos de instância. 19. (FGV – 2010 – BADESC – Analista de Sistemas) Observe o código em Java a seguir, em que se pode verificar a aplicação dos operadores de pré-decremento e pós-decremento. Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 159 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03 public class Decrementa { public static void main (string args {} ) { int m, n = 44; m = --n; m = n--; system.out.println (m); system.out.println (n); }
} Após a execução do código, as variáveis m e n exibirão, respectivamente, os valores: a) 42 e 41. b) 42 e 42. c) 42 e 43. d) 43 e 42. e) 43 e 43. GV – 2015 – TJ/BA – Analista de Sistemas) Em Java, os métodos declarados sem modificadores em uma interface são implicitamente: a) públicos e estáticos; b) públicos e abstratos; c) privados e estáticos; d) públicos e finais; e) privados e abstratos. 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 160 de 161
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 03
GABARITO DOS EXERCÍCIOS COMENTADOS (CESPE) JAVA SE 1 C 11 C 21 E 31 C
2 C 12 E 22 C 32 E
3 E 13 A 23 C 33 C
4 C 14 C 24 C 34 E
5 E 15 C 25 E 35 E
6 E 16 C 26 C 36 C
7 C 17 C 27 E 37
8 E 18 C 28 C 38
9 C 19 E 29 C 39
10 C 20 E 30 E 40
9 C 19 E 29 E 39
10 C 20 E 30 C 40
GABARITO DOS EXERCÍCIOS COMENTADOS (FCC) JAVA SE 1 B 11 E 21 C 31 C
2 A 12 E 22 A 32 C
3 D 13 D 23 D 33 C
4 C 14 A 24 A 34 A
5 C 15 D 25 D 35 B
6 B 16 E 26 B 36 E
7 B 17 C 27 D 37
8 C 18 A 28 B 38
16712855225
GABARITO DOS EXERCÍCIOS COMENTADOS (DIVERSAS) JAVA SE 1 D 11 C
2 B 12 C
3 B 13 E
Prof. Diego Carvalho
4 E 14 E
5 C 15 B
6 B 16 A
7 E 17 C
www.estrategiaconcursos.com.br
8 B 18 B
9 B 19 D
Pág. 161 de 161
10 C 20 B
Aula 04 Desenvolvimento de Software para Concursos - Curso Regular Professor: Diego Carvalho
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
AULA 04
SUMÁRIO
PÁGINA 01 02 19 56 90 199 156
Apresentação - Java Enteprise Edition (JAVA EE) - Java Server Pages (JSP) - Servlets - Java Server Faces (JSF) Lista de Exercícios Comentados Gabarito
Lógica de Programação. Tipos de Dados. Operadores e Expressões. Estruturas de Controle, Seleção, Repetição e Desvio. Recursividade. Funções e Procedimentos. Complexidade de Algoritmos. Métodos de Ordenação. BubbleSort, InsertionSort, SelectionSort, QuickSort, ShellSort, MergeSort e HeapSort. Estruturas de Dados. Vetores e Matrizes. Lista Encadeada. Pilhas. Filas. Árvore. Grafos. Hashing. Estrutura de Arquivos. Padrões de Projeto GOF. Padrões de Projeto Java EE. Padrões de Projeto GRASP. Java SE. Conceitos Básicos. Plataforma Java. Compilação e Interpretação. agem por Valor e Referência. Empacotamento. Raiz. Identificadores. Blocos e Comandos. Comentários. Palavras Reservadas. Tipos Primitivos. Operadores. Vetores. Conversão de Tipos. Controle de Fluxos. Classes. Objetos. Atributos. Métodos. Herança. Encapsulamento. Interface. Polimorfismo. Interface Gráfica. Tipos Enumerados. Anotações. Classes Internas. Reflexão e Genéricos. Tratamento de Exceções. Sincronismo e Multithreading. Coleções. Streams e Serialização. Classes e Operações de I/O. Novidades Java 8. Arquitetura Java EE. JSP. Servlets. JSF. JPA. Hibernate. JDBC. JVM. Spring. Struts. JMS. JNDI. JTA. JSTL. HTML e CSS. JavaScript. JQuery. AJAX. DHTML. XHTML. XML. XSLT. XSD. Sistemas Móveis. Android. iOS. Segurança no Desenvolvimento. Compiladores e Interpretadores. Ferramentas de Controle de Versão. SVN. CVS. Git. Análise Estática de Código-Fonte. SonarQube. Integração Contínua (e outros) Framework .NET, C#, Visual Basic, ASP.NET e Visual Studio (Prof. Mayara Rosa) Delphi e PHP (Prof. Mayara Rosa). 16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 1 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
JAVA ENTEPRISE EDITION (JAVA EE) Bem, galera... nosso foco aqui é Java EE1! Empresas de tecnologia da informação sofrem atualmente com a altíssima competitividade. Não é raro ver uma gigante, que todo mundo achava que seria eterna, desmoronando-se por conta de uma nova tecnologia que surgiu ou paradigma que apareceu! Ou alguém aí ainda usa IRC, ICQ, MSN para se comunicar? É verdade, professor! As empresas de Tecnologia da Informação têm vida curta! Não são só elas! Hoje em dia, empresas de quaisquer áreas precisam de aplicações para satisfazer as suas necessidades de negócio, que estão se tornando cada vez mais complexas. E tudo isso se torna mais complicado com a globalização – as empresas estão cada vez mais espalhadas por cidades, países e continentes. E, ainda assim, realizam seus negócios 24/7 por meio da internet, com um bocado de data centers e sistemas internacionalizados para lidar com diferentes línguas, moedas, fusos-horários, etc. E elas param de trabalhar em algum momento? Não! Estão sempre tentando diminuir seus custos, tempo de resposta de seus serviços, armazenar mais dados de maneira confiável e segura, entre outros. E tudo isso de forma transparente para o cliente, que simplesmente a uma interface gráfica amigável achando que isso tudo é muito simples (mal sabem o que ocorre por trás). Pessoal, tudo tem que funcionar para o usuário não reclamar ou trocar de prestadora de serviço – e, claro, sem perder dinheiro, i.e., tem que haver prevenção de falhas, alta disponibilidade, redundância, escalabilidade e segurança. Além disso, as corporações têm de enfrentar constantes mudanças de requisitos, tecnologias, políticas, leis, etc. Em 2014, grande parte do que citamos é oferecido pelo Java Enterprise Edition (Java EE). Mas, então, o que é de fato o Java EE? É um conjunto de especificações destinadas ao desenvolvimento de aplicações distribuídas, robustas, potentes, escaláveis, multicamadas e de alta disponibilidade. 16712855225
Rapaziada, vamos ver agora algumas novidades trazidas pela Plataforma Java EE 6: conceito de profiles ou perfis; Java API for RESTful Web Services (JAX-RS); Managed Beans; Contexts and Dependency Injection (CDI); Dependency Injection for Java;
1
Esse nome já mudou repetidas vezes! Inicialmente, chamava-se J2EE; depois foi modificado para JEE; e atualmente é conhecido como Java EE.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 2 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
Bean Validation; entre outras tecnologias concernentes a Enterprise JavaBeans, JavaServer Faces e Servlets. Como ele oferece tudo isso, nós veremos por meio do estudo de um assunto muito importante: Arquitetura Java EE – apresentada na imagem abaixo:
O Client System é a Camada do Cliente; Web Container é a Camada Web; o EJB Container é a Camada de Negócio; e o Database é a Camada de Dados2. No entanto, há quem condense a Camada Web e a Camada de Negócio em uma camada chamada Servidor Java EE, representada pelo retângulo maior à direita – veremos com detalhes mais à frente!
16712855225
2
É também conhecida como Camada EIS (Enterprise Information System), que disponibiliza informações relevantes ao negócio e, diferente do que apresenta a imagem, não trata apenas do banco de dados, mas também de sistemas legados, processamento de transações de mainframe, sistemas externos, entre outros.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 3 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
Vamos falar um pouco agora sobre o Modelo de Aplicações Java EE! Galera, Java EE é projetado para ar aplicações que implementam serviços corporativos para clientes, empregados, fornecedores, parceiros e outros que demandem ou contribuem com a organização! Essas aplicações são inerentemente complexas, ando dados de diversas fontes e distribuindo as aplicações entre os clientes. O Modelo de Aplicações Java EE define uma arquitetura para implementação de serviços como aplicações multicamadas que fornecem escalabilidade, ibilidade e gerenciabilidade necessários para aplicações corporativas. Dessa forma, a lógica de apresentação e a lógica de negócio são implementadas pelo desenvolvedor e os outros serviços são fornecidos pela plataforma Java EE! Conforme mostra a imagem acima, existem duas aplicações multicamadas Java EE divididas em níveis descritos como se segue:
Camada do Cliente: componentes rodam na Máquina Cliente; Camada Web: componentes rodam no Servidor Java EE; Camada de Negócio: componentes rodam no Servidor Java EE; Camada EIS: software roda no Servidor EIS.
Galera, a imagem abaixo apresenta um pouco da evolução do Java EE e a tabela que segue apresenta as APIs do Java EE:
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 4 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
JAVA EE 6 (10/12/2009)
JAVA EE 7 (12/06/2013)
-
Java API for WebSocket Java API for JSON Processing Java Servlet 3.0 Java Servlet 3.1 JavaServer Faces (JSF) 2.0 JavaServer Faces (JSF) 2.2 Expression Language (EL) 2.2 Expression Language (EL) 3.0 JavaServer Pages (JSP) 2.2 JavaServer Pages (JSP) 2.3 JavaServer Pages Standard Tag Library (JSTL) 1.2 JavaServer Pages Standard Tag Library (JSTL) 1.2 Batch Applications for the Java Platform Concurrency Utilities for Java EE 1.0 Contexts and Dependency Injection for Java 1.0 Contexts and Dependency Injection for Java 1.1 Dependency Injection for Java 1.0 Dependency Injection for Java 1.0 Bean Validation 1.0 Bean Validation 1.1 Enterprise JavaBeans (EJB) 3.1 Enterprise JavaBeans (EJB) 3.2 Interceptors 1.1 Interceptors 1.2 Java EE Connector Architecture 1.6 Java EE Connector Architecture 1.7 Java Persistence API (JPA) 2.0 Java Persistence API (JPA) 2.1 Common Annotations for the Java Platform 1.1 Common Annotations for the Java Platform 1.2 Java Message Service API (JMS) 1.1 Java Message Service API (JMS) 2.0 Java Transaction API (JTA) 1.1 Java Transaction API (JTA) 1.2 JavaMail API 1.4 JavaMail API 1.5 Java API for RESTful Web Services (JAX-RS) 1.1 Java API for RESTful Web Services (JAX-RS) 2.0 Implementing Enterprise Web Services 1.3 Java API for XML-Based Web Services (JAX-WS) 2.2 Java API for XML-Based Web Services (JAX-WS) 2.2 Web Services Metadata for the Java Platform 2.1 Web Services Metadata for the Java Platform Java API for XML-based RPC (JAX-RPC) 1.1 Java API for XML-based RPC (JAX-RPC) (Opcional) 1.1 Java APIs for XML Messaging (JAXM) 1.3 Java APIs for XML Messaging 1.3 Java API for XML Registries (JAXR) 1.0 Java API for XML Registries (JAXR) 1.0 Java Authentication Service Provider Interface for Java Authentication Service Provider Interface for Containers Containers (JASPIC) 1.0 (JASPIC) 1.1 Java Authorization Service Provider Contract for Containers Java Authorization Service Provider Contract for Containers (JACC) 1.4 (JACC) 1.5 Java EE Application Deployment 1.2 Java EE Application Deployment (Opcional) 1.2 J2EE Management 1.1 J2EE Management 1.1 Debugging for Other Languages 1.0 Java Architecture for XML Binding (JAXB) 2.2 Java Architecture for XML Binding (JAXB) 2.2 Java API for XML Processing (JAXP) 1.3 Java Database Connectivity 4.0 Java Management Extensions (JMX) 2.0 JavaBeans Activation Framework (JAF) 1.1 Streaming API for XML (StAX) 1.0 Managed Beans 1.0 Web Services 1.3 Debuggin for Other Languages 1.0 16712855225
A versão Java EE 6 traz o conceito de profile (ou perfil)! O que é isso, professor? Um perfil busca definir um subconjunto das tecnologias dentre aquelas da plataforma Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 5 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
Java EE. Como assim? Bem, pensem comigo: cada aplicação tem sua particularidade, portanto não é necessário implementar obrigatoriamente todas as tecnologias da plataforma, i.e., eu posso criar perfis – cada um com sua configuração! Imaginem que vamos fazer um sisteminha pequeno! Eu preciso implementar tudo que está na plataforma? Não, posso criar um perfil que implementa somente um subconjunto de funcionalidades! Existem dois perfis importantes: Web Profile e Full Profile! O primeiro perfil é um subconjunto do segundo e ajuda desenvolvedores a criarem aplicações mais leves que podem rodar em um Servlet Container. Plataforma Java EE Java Servlet Java Server Faces (JSF) Java Server Pages (JSP) Expression Language (EL) Standard Tag Library for JavaServer Pages (JSTL) Debugging for Other Languages Contexts and Dependency Injection for the Java EE Platform Dependency Injection for Java Enterprise JavaBeans (EJB) Java Persistence API Common Annotations for the Java Platform Java Transaction API Bean Validation Java EE Connector Architecture Java API for RESTful Web Services (JAX-RS)
Java EE 6
Java EE 7
Observem que a tabela abaixo apresenta o EJB 3.1 como parte do Web Profile. Na verdade, no Web Profile, trata-se do EJB 3.1 Lite, que é mais leve. Como assim, professor? Assim como os perfis, ele possui um subconjunto dos features do EJB 3.1 Full. Por que? Porque é uma API utilizada especificamente para aplicações web. Vejam a diferença de acordo com a tabela abaixo. 16712855225
Percebam que o EJB 3.1 Lite deixa de fora funcionalidades que são pouco utilizadas em aplicações web. De forma similar o Web Profile não oferece e a JAX-WS, JAX-RPC, JAXR, SAAJ, JAX-RS, JAXB, JMS, JAAS, JASPIC, JACC, JCA, JavaMail, Management Specification e Deployment Specification – além disso, ele não oferece e a Arquivos EAR (apenas Arquivos WAR).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 6 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
Para finalizar, vamos entender algumas coisinhas! O processo de implantar (para alguns, instalar) uma aplicação em um Servidor Java EE é chamado Deploy ou Deployment. Sabe-se que componentes são agrupados em módulos, compactados em .ZIP e, na Implantação, mapeia-se cada componente do Java EE para seu contêiner correspondente. Existem três tipos básicos de módulo:
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 7 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
MÓDULO
DESCRIÇÃO
EAR
Também chamado Enteprise Application Archives, contém a aplicação completa, com todos os seus módulos e componentes. É composta por vários arquivos .war e .jar. Também chamado Web Application Archives, contém a Aplicação Web (JSP, HTML, Servlets, Arquivos de Configuração, Imagens, etc) – é o que forma uma página em si. Também chamado Java Application Archives, contém a Aplicação EJB, Aplicação Cliente e Applets3, além de arquivos de configuração dos aplicativos. Também chamado Resource Adapter, contém interfaces, classes, bibliotecas, etc.
WAR JAR RAR
16712855225
3
A bem da verdade, todos os módulos são Arquivos JAR com a extensão modificada. Por que essa mudança? Para que o servidor possa diferenciar o que está sendo implantado.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 8 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
(CESPE – – INMETRO – Analista de Sistemas) São exemplos de tipos de componentes de software reusáveis desenvolvidos na plataforma JEE: JSP (Java Server Page); biblioteca de tags; Servlet; EJB. O grau de reúso provido por esses componentes, EJBs e JSPs, é usualmente superior a bibliotecas de TAG. Comentários: Galera, vamos responder isso intuitivamente! Como uma Página JSP ou um Componente EJB poderia oferecer maior reusabilidade que uma biblioteca? Ora, essa é uma das principais características de uma biblioteca: sua reusabilidade! Logo, isso não faz sentido! Bibliotecas de Tags são mais reusáveis. Gabarito: E (CESPE – – SERPRO – Analista de Sistemas) A tecnologia Enterprise JavaBeans (EJB) é uma arquitetura de componentes do tipo cliente que atua na plataforma J2EE. Comentários:
16712855225
JAVA EE 6 (10/12/2009) Enterprise JavaBeans (EJB) 3.1
Prof. Diego Carvalho
JAVA EE 7 (12/06/2013) Enterprise JavaBeans (EJB) 3.2
www.estrategiaconcursos.com.br
Pág. 9 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
Conforme vimos em aula, Enterprise Java Bean (EJB) não é uma arquitetura, é um componente da Arquitetura J2EE. Além disso, é do tipo Servidor (veja a imagem acima). Gabarito: E (CESPE - 2010 – TCU – Auditor Federal de Controle Externo) A web profile da plataforma JEE apresenta, em relação ao perfil application server definido em edições anteriores da plataforma Java, as seguintes vantagens: fornece e para POJOs (Plain Old Java Objects) e Annotations; possui modelo de empacotamento de componentes mais simples; a configuração dos seus descritores XML (extensible markup language) é mais fácil; é aderente ao padrão SOA. Comentários: Imaginem que vamos fazer um sisteminha pequeno! Eu preciso implementar tudo que está na plataforma? Não, posso criar um perfil que implementa somente um subconjunto de funcionalidades! Existem dois perfis importantes: Web Profile e Full Profile! O primeiro perfil é um subconjunto do segundo e ajuda desenvolvedores a criarem aplicações mais leves que podem rodar em um Servlet Container. Conforme vimos em aula, primeiro, não existe Application Server Profile – existe apenas Web Profile e Full Profile. Segundo, o conceito de Perfis foi introduzido apenas no Java EE 6 – eu calculo que ele esteja considerando Full Profile como Application Server Profile. Terceiro, POJOs e Annotations são tecnologias do Java EE 5. Quarto, pode-se dizer que é aderente ao SOA por conta do JAX-RS, no entanto o Full Profile também é (inclusive é aderente ao JAX-RS também). Logo, a questão está errada desde o início. 16712855225
Gabarito: E (CESPE - 2010 – TRE/MT – Analista Judiciário – Tecnologia da Informação – A) Clientes J2EE são necessariamente páginas web dinâmicas que normalmente não fazem os a banco de dados, nem executam regras de negócio complexas. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 10 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
Conforme vimos em aula, os clientes Java EE não são necessariamente Páginas Web Dinâmicas (Browser). A imagem acima mostra que eles podem ser também uma Aplicação Cliente. Gabarito: E (CESPE - 2010 – TRE/MT – Analista Judiciário – Tecnologia da Informação – D) Um componente J2EE é uma unidade funcional de software autocontida, escrito na linguagem de programação Java e executado exclusivamente em servidores. Comentários:
16712855225
Conforme vimos em aula, um componente Java EE é uma unidade autocontida, porque pode ser reusada sem a necessidade de incluir ou depender de outros componentes. Ademais, eles são escritos na linguagem de programação Java, no entanto não são necessariamente executados exclusivamente em servidores, podem ser executados no cliente (conforme imagem acima). Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 11 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
(CESPE - 2011 – PREVIC – Analista de Sistemas) Em uma aplicação multicamadas na plataforma Java EE, servlets, JavaServer Faces e JSP consistem em tecnologias utilizadas na camada web. Comentários:
Conforme vimos em aula, a Camada Web é composta por JSP, JSF e Servlets. Gabarito: C (ESAF – 2012 – CGU – Analista de Finanças e Controle) Os níveis da plataforma J2EE são: a) Patrocinador. Web. Negócios. Sistemas de Computação Corporativos. b) Cliente. Web. Negócios. Sistemas de Informação Corporativos. c) Cliente. Interno. Externo. Negócios. d) Fornecedor. Web. Político. Sistemas de Informação Camada. e) Cliente. Stakeholders. Negócios. Background corporativo. 16712855225
Comentários:
Camada do Cliente: componentes rodam na Máquina Cliente; Camada Web: componentes rodam no Servidor Java EE; Camada de Negócio: componentes rodam no Servidor Java EE; Camada EIS: software roda no Servidor EIS.
Conforme vimos em aula, os níveis são: Cliente, Web, Negócios e Sistemas de Informação Corporativos (EIS).
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 12 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
Gabarito: B (CESGRANRIO – 2008 – BNDES – Analista de Sistemas) Uma aplicação empresarial contendo componentes EJB e módulos web deverá ser publicada em um servidor de aplicações compatível com J2EE. No contexto do empacotamento dessa aplicação para publicação (deploy), é correto afirmar que: a) não há como juntar componentes EJB e módulos web em uma mesma aplicação, pois deverão ser publicados separadamente. b) um arquivo EAR poderá conter arquivos WAR e JAR representativos dos módulos web e EJB. c) o tamanho do pacote, em bytes, sempre fica maior que o código original, em virtude do algoritmo empregado no empacotamento da aplicação em um arquivo EAR. d) módulos web não devem ser empacotados, pois isso inviabiliza seu o pela Internet. e) arquivos JAR servem apenas para empacotar componentes EJB. Comentários: Para finalizar, vamos entender algumas coisinhas! O processo de implantar (para alguns, instalar) uma aplicação em um Servidor Java EE é chamado Deployment. Sabe-se que componentes são agrupados em módulos, compactados em .ZIP e, na Implantação, mapeia-se cada componente da Arquitetura Java EE para seu contêiner correspondente. Existem três tipos básicos de módulo: 16712855225
Conforme vimos em aula, a primeira opção está errada, porque pode-se junta ambos em um Arquivo EAR; a segunda opção está correta e justifica a primeira; a terceira opção está errada, porque são arquivos compactados em .ZIP; a quarta opção está errada, porque simplesmente não faz nenhum sentido; e a última opção está errada porque arquivo JAR pode empacotar componentes EJB, Cliente e Applet. Gabarito: B (FCC – 2011 – TRT/19 – Analista de Sistemas) A especificação Java EE define os seguintes componentes: Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 13 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
I. Clientes da aplicação (Application Clients) e applets. II. Java Servlet, JavaServer Faces e JavaServer Pages. III. Enterprise Javabeans (EJB). Os componentes I, II e III rodam, respectivamente, em: a) cliente, cliente, servidor. b) servidor, cliente, servidor. c) cliente, servidor, servidor. d) servidor, cliente, cliente. e) cliente, servidor, cliente. Comentários:
Conforme vimos em aula, tanto aplicações clientes como applets rodam no cliente; Servlets, JSF e JSP rodam no Servidor, assim como o EJBs. Gabarito: C 16712855225
10. (FCC - 2011 - TRT - 1ª REGIÃO (RJ) - Analista Judiciário - Tecnologia da Informação) J2EE é uma plataforma de programação para servidores na linguagem de programação Java, que integra uma série de especificações e containers, cada uma com funcionalidades distintas. Nesse contexto, é correto afirmar que são integrantes do J2EE: a) Servlets, Jcompany e JSP. b) JDBC, JSP, EJBs. c) EJBs, Servlets e JBoss. d) JDBC, Hibernate e JPA.
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 14 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
e) JSP, JSF e Eclipse. Comentários:
JAVA EE 6 (10/12/2009)
JAVA EE 7 (12/06/2013)
JavaServer Pages (JSP) 2.2 Enterprise JavaBeans (EJB) 3.1 -
JavaServer Pages (JSP) 2.3 Enterprise JavaBeans (EJB) 3.2 Java Database Connectivity 4.0
Conforme vimos em aula, trata-se do JDBC, JSP e EJB! Gabarito: B 11. (FCC - 2010 - TRT - 8ª Região (PA e AP) - Analista Judiciário - Tecnologia da Informação) O Contêiner J2EE que fornece aos desenvolvedores o ambiente para rodar Java Server Pages (JSPs) e servlets é: a) Applet (Applet container). b) Enterprise Java Beans (EJB). c) Interface (Interface container). d) do cliente do aplicativo (Application client container). e) Web (Web container). Comentários:
16712855225
Conforme vimos em aula, o Contêiner Web é o responsável por rodar JSP/Servlet! Gabarito: E
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 15 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
12. (FCC - 2010 - TCE- - Agente da Fiscalização Financeira - Informática - e de Web) São apenas tipos de componentes executados em servidores Web: a) Beans, Servlets e J2EE. b) JVM, Servlets e JSP. c) Beans, Servlets e JSP. d) Beans, Swing e JSP. e) Beans, Swing e JVM. Comentários:
Conforme vimos em aula, JSP e Servlets são fáceis! E os beans? Pois é, excepcionalmente eles podem ser executados em Servidores Web (Contêiner Web). Gabarito: C 13. (FCC - 2014 – TRT/2 – Analista de Sistemas) Um contêiner Java EE pode oferecer serviços como gestão de memória, ciclo de vida e estado de objetos, conexões, transações, serviços de nomes, segurança, tolerância a falhas, integração, clustering, alta disponibilidade, confiabilidade e web services. Um servidor Java EE completo disponibiliza dois tipos principais de contêiner, que são: 16712855225
a) Contêiner MVC e Contêiner EJB. b) Applet Container e Web Container. c) Contêiner Web e Contêiner EJB. d) Servlet Container e JSP Container. e) Application Client Container e Web Container. Comentários:
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 16 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
Conforme vimos em aula, disponibiliza o Contêiner Web e Contêiner EJB! Gabarito: C 14. (FCC – 2012 – TJ/PE – Analista de Sistemas) Sobre a plataforma Java EE 6, é correto afirmar: a) Simplifica a implantação sem a necessidade de descritores de implantação, com exceção do descritor de implantação exigido pela especificação servlet, o arquivo web.xml. b) Necessita do descritor de implantação ejb-jar.xml e entradas relacionadas aos web services no arquivo web.xml. c) Faz uso de anotações (annotations). Anotações são modificadores Java, semelhantes aos públicos e privados, que devem ser especificados nos arquivos de configuração XML. d) A especificação EJB 3, que é um subconjunto da especificação Java EE, define anotações apenas para o tipo bean. 16712855225
e) Anotações são marcados com um caracter # (cerquilha). Comentários: (a) Correto. Pessoal, a plataforma Java EE realmente simplifica a implantação removendo a necessidade de descritores de implantação, mas há uma exceção: o arquivo web.xml;
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 17 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
(b) Descritores de implantação, como o ejb-jar.xml e entradas relacionadas aos Web services no web.xml, já estão obsoletos – não se usa mais! (c) A Plataforma Java EE utiliza Anotações, que são modificadores Java, semelhantes aos públicos e privados. No entanto, eles são especificados no código! (d) Ele define anotações para o tipo Bean, tipo de Interface, referências de recurso, atributos de transação, segurança, etc; (e) Essa ele entregou! Anotações são marcados com @. Gabarito: A ACERTEI
ERREI
16712855225
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 18 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04
JAVA SERVER PAGES (JSP) Primeiro, o que é JSP? É uma tecnologia da plataforma Java Enterprise Edition (Java EE) que permite utilizar ou o código Java dentro das páginas web ou tags que realizam sua lógica. Por ser tecnologia Java, seus objetos são definidos segundo define a linguagem, i.e., podendo utilizar todos os seus recursos, tais como modificadores de o, tratamento de exceções, entre outros. Galera, trata-se de uma tecnologia para geração de documentos baseados em texto e executados do lado do servidor (assim como Servlets). Professor, como assim texto? Esse texto pode ser um conjunto de dados estáticos (Ex: HTML e XML); ou pode ser um conjunto de elementos JSP e tags customizadas, que definem como a página construirá conteúdo dinâmico. Professor, como funciona esse tal de JSP? Cara, Páginas JSP utilizam tags XML e Scriplets escritos em Java para encapsular a lógica que gera o conteúdo para a página web. Ele separa a lógica do conteúdo da sua apresentação. Páginas JSP são compiladas em Servlets e podem chamar beans a fim de executar o processamento no servidor. Espera, professor! Como assim são compiladas em Servlets? Cara, Páginas JSP tipicamente se tornam uma Servlet! Vocês podem me perguntar: Por que, então, precisamos da tecnologia JSP se já temos a tecnologia de Servlets? Teoricamente, é possível escrever apenas Servlets para desenvolver suas aplicações web. No entanto, a Tecnologia JSP foi desenhada para simplificar o processo de criação de páginas ao separar a apresentação do conteúdo. Em muitas aplicações, a resposta enviada ao cliente é a combinação dos dados de apresentação (template) com dados de conteúdo gerados dinamicamente. Nesse caso, é muito mais fácil trabalhar com Páginas JSP do que fazer tudo com Servlets. Galera, basta pensar nos conceitos de coesão, acoplamento e modularidade. Vocês entenderam a sacada do negócio? 16712855225
É mais simples, organizado e legível utilizar uma tecnologia para fazer a apresentação e outra para gerar dados dinamicamente – assim, mantém-se a divisão de responsabilidades, a independência entre os módulos, entre outros benefícios. Você ainda não entendeu? Acho que sei como fazer isso entrar na sua cabeça: vamos ver agora uma Servlet e uma Página JSP!
Prof. Diego Carvalho
www.estrategiaconcursos.com.br
Pág. 19 de 156
Curso Regular de Desenvolvimento de Software Curso de Teoria e Exercícios - 2016 Prof. Diego Carvalho – Aula 04 Arquivo: HelloWorld.jsp (No MVC, em geral, é utilizada como Visão)
<%="Hello World"% 1z4in <%out.println("Hello Again!");%>