8 - Colecções e Tipos Parametrizados Tópicos Introdução ao Java Collections Framework (JCF); Tipos parametrizados; Tipo parametrizado ArrayList<E>; Iteradores de colecções; Auto-Boxing/Unboxing; Tipos parametrizados e subtipos;
Wildcards; Tipos Map<K,V>; Interface Comparable<T>; Tipos Set<E>; Tipos enumerados; Tipos EnumSet<E> e EnumMap<K,V>.
8.1 Introdução Estudámos até agora todas as construções que nos permitem desenvolver classes JAVA ou interfaces JAVA a serem implementadas por classes. Foi feita a distinção entre o papel das classes abstractas e das interfaces no desenho de aplicações, e ficámos a saber que as interfaces existem numa hierarquia distinta da hierarquia de classes, hierarquias que se relacionam semanticamente através de uma relação de implementação. No entanto, e aparte as referências feitas aos arrays de JAVA, que não são objectos, não estudámos ainda mecanismos ou construções que nos permitam realizar agrupamentos de objectos em estruturas que os representem como uma unidade de informação, possuindo certas propriedades e podendo ser manipulada através de certas operações. Ainda que o termo estrutura de dados seja tradicionalmente empregue para designar os agrupamentos de entidades que não são objectos mas valores, se alargarmos um pouco o seu sentido, poderemos dizer que nos falta agora estudar estruturações de objectos que são, ao nível da POO, os contentores da nossa informação. Assim, vamos dedicar os próximos capítulos ao estudo de classes que representam em JAVA estruturas de dados predefinidas, que podemos reutilizar nos nossos programas na criação de classes mais complexas de que necessitamos na resolução de problemas de maior complexidade também. © FCA - Editora de Informática
253
JAVA6 E PROGRAMAÇÃO ORIENTADA PELOS OBJECTOS
Estas classes de JAVA designam-se por colecções (collections), representam as mais usuais estruturas de dados necessárias no desenvolvimento de aplicações, possuem características próprias que devemos conhecer para delas podermos tirar o melhor partido, são bastante genéricas e são muito eficientes. Com a possibilidade de agruparmos objectos em unidades de informação compactas e estruturadas, que representam entidades do mundo real que têm características semelhantes, elevamos em muito o nível da nossa programação, pois temos à nossa disposição excelentes estruturas de representação de dados.
8.2 Colecções de JAVA5/6 Desde a versão original JDK1.0 de 1996, que JAVA possui no seu package java.util classes que implementam algumas das estruturas de dados (objectos), em conjunto com as respectivas operações (algoritmos), mais utilizadas no desenvolvimento de aplicações. Porém, é com o aparecimento do JDK1.2, em 1999, que se dá uma verdadeira revolução no package java.util com o aparecimento de uma estrutura de interfaces, classes abstractas e classes concretas, organizadas no sentido de oferecer ao programador uma grande diversidade de implementações eficientes das mais comuns estruturas de dados e entidades matemáticas, designada JAVA Collections FrameWork (JCF), muitas vezes até apenas Collections. Uma colecção (noutras linguagens designada container) é um objecto capaz de agrupar múltiplos elementos numa unidade única de representação e processamento devidamente organizada, possuindo propriedades de estrutura e funcionamento próprias. Por exemplo, como certamente sabemos, uma estrutura stack (ou pilha) é uma estrutura linear, ou seja, existe uma ordem sequencial nos seus elementos, e funciona segundo uma lógica de que o último elemento inserido será o primeiro a ser removido. Estas são as propriedades de uma qualquer stack. A forma de implementarmos as propriedades são inúmeras, e estas propriedades são independentes dos conteúdos da estrutura de dados. A Collections FrameWork é uma arquitectura unificada, constituída por interfaces, classes abstractas, implementações (classes concretas) e métodos (algoritmos), visando representar e manipular colecções, normalizando as API, oferecendo conversões entre estruturas, reduzindo o esforço de aprendizagem e de programação, e oferecendo grandes soluções para reutilização. A importância deste framework para a criação de aplicações em JAVA é absolutamente crucial, dado que a maioria das aplicações que desenvolvemos usam muitas das classes implementadas no JCF. No entanto, e dada a proliferação destas e as diferentes especializações das suas implementações, em termos de eficiência e utilização, a escolha da implementação adequada implica um conhecimento bastante aprofundado de todas as diferentes Colecções que o JCF coloca ao nosso dispor. Vamos assim, e numa primeira abordagem, sintetizar a estrutura interna do JCF, do ponto 254
© FCA - Editora de Informática
COLECÇÕES E TIPOS PARAMETRIZADOS
de vista dos seus próprios autores, que a dividem nas seguintes infra-estruturas:
Utilitários para arrays: por exemplo, a classe Arrays já antes referida, que presta serviços algorítmicos a arrays; Algoritmos: métodos estáticos da classe Collections que prestam serviços às mais diversas colecções de objectos, como ordenação, procura, etc.; Classes abstractas: implementações parciais de certas classes que satisfazem certas interfaces, para que sejam complementadas (implementadas) de diversas formas distintas pelas subclasses concretas; Wrapper, Concurrent, Special-purpose implementations: implementações que adicionam funcionalidade a outras, como métodos para conversão de e para tipos primitivos, sincronização ou gestão de concorrência, restrições, etc.; Legacy implementations: classes de anteriores implementações que, em vez de serem desactivadas (deprecated), foram reajustadas para satisfazerem as interfaces do JCF; General-purpose implementations: classes do JCF que são as primeiras implementações das interfaces originais; Collection Interfaces: as API fundamentais que estruturam todas as classes do JCF, dividindo-as em quatro grandes famílias de estruturas − os conjuntos, as listas, as correspondências (maps ou mappings) e as filas. Estas quatro interfaces são a base de todo o JCF em termos de tipos das colecções.
A Collections Interface define quatro interfaces fundamentais, de tal forma que as classes que as implementam são estruturas com as seguintes propriedades: 1. Set: conjuntos de objectos no sentido matemático, logo, não existindo a noção de posição, conforme “primeiro”, “último”, etc., nem sendo permitidos elementos em duplicado. 2. List: sequências de objectos, logo, existindo a noção de ordem, cf. “primeiro”, “último”, “n-ésimo”, etc., permitindo elementos duplicados. 3. Map: os mappings, que são correspondências unívocas um para um entre objectos (representando funções matemáticas finitas), em geral correspondências do tipo chave-valor, em que as chaves são o domínio e são um conjunto (logo, não havendo chaves em duplicado). A correspondência é apenas unívoca, porque a chaves diferentes pode ser feito corresponder o mesmo valor. 4. Queue: as filas são estruturas lineares do tipo FIFO (first in first out), com métodos próprios para inserção e remoção, destinadas em geral a conter elementos em estado de espera para serem processados.
Em finais de 2004, foi lançado o JDK1.5 Tiger (JAVA5), versão que veio introduzir na linguagem JAVA as maiores modificações sintácticas, e não só, desde o lançamento da mesma. Estas modificações praticamente não alteraram a JVM, à excepção do código gerado para as classes. No entanto, a nível sintáctico e ao nível dos tipos de dados muito mudou, passando a verificação de tipos a ser toda realizada em tempo de compilação.
© FCA - Editora de Informática
255
JAVA6 E PROGRAMAÇÃO ORIENTADA PELOS OBJECTOS
São três as modificações introduzidas em JAVA5 que se relacionam directamente com as colecções: Auto-Boxing e Auto-Unboxing: mecanismo que converte automaticamente valores de tipos primitivos (cf. int, double, etc.) em objectos das classes correspondentes (wrapper classes) quando estes são inseridos em colecções, e faz a conversão contrária quando instâncias de classes wrapper são lidas de colecções, evitando assim a necessidade de programar operações de casting; Iterador foreach: sob a forma de um ciclo for aplicável a colecções que podem ser iteradas (Iterable), substituindo os iteradores explícitos em muitas circunstâncias; Tipos genéricos: que adicionam às colecções generalidade e segurança em tempo de compilação, e eliminam o intenso casting que era necessário.
A modificação de maior impacto foi a que implicou a alteração, ainda que não em termos de estrutura, de todo o JCF: a introdução dos tipos genéricos (Generics no original). A estrutura de interfaces, para além da sua parametrização e da introdução da interface Queue<E>, é a mesma que existia anteriormente e que se apresenta na Figura 8.1:
Iterable<E>
Collection<E>
Set<E>
List<E>
Map<K,V>
Queue<E>
SortedSet<E> NavigableSet<E>
SortedMap<K,V>
NavigableMap<K,V>
Figura 8.1 – Interfaces do JCF – Tipos de colecções
Em primeiro lugar, uma questão de notação e leitura: Collection<E> (ou, em geral, I<E>) deve ler-se “Collection de elementos de tipo E” ou apenas “uma Collection de E”, em que E é o tipo dos elementos, por exemplo, String, Integer, Ponto, etc. A primeira constatação a tirar da Figura 8.1 é que as correspondências (ou maps) não herdam da interface Collection<E>, pelo que, em extremo rigor, não seriam colecções. Claro que os maps são colecções de objectos, são compatíveis com outras colecções, mas, 256
© FCA - Editora de Informática
COLECÇÕES E TIPOS PARAMETRIZADOS
como são parametrizados por dois tipos, não podem herdar de Collection<E> que apenas aceita um parâmetro. Ao longo do texto, sempre que falarmos de colecções de JAVA, os maps estarão incluídos em tal classificação mais lata. Assim, em JAVA5/6, colecções monoparâmetro ou são listas, a hierarquia de List<E>, ou conjuntos, a hierarquia de Set<E>, ou filas, a hierarquia de Queue<E>. Todas as classes que são implementações de C<E> são Cs implementadas de forma distinta, mas todas “falam” a mesma “linguagem” definida pela sua interface (API). Vantagem óbvia: depois de estudarmos uma implementação de lista, uma de conjunto, uma de fila e uma de map, sabemos a API de praticamente todas, e apenas necessitaremos de saber quais as suas “melhores” implementações (especializações) para cada tipo de problema. Neste capítulo, a nossa atenção estará centrada no conhecimento destas colecções e no seu estudo visando apenas a sua eficaz utilização na criação das nossas próprias classes e aplicações. Adiante neste livro veremos como podemos desenvolver as nossas próprias classes parametrizadas, sejam estruturações de objectos ou não. É conveniente recordar aqui, desde já, que, tal como vimos no capítulo das “Interfaces”, uma interface é um tipo, e uma qualquer classe que implemente tal tipo é compatível com esse tipo, pelo que as atribuições são válidas. Assim, é válida, em termos genéricos, a atribuição List<E> le = new implementação_de_List<E>(), para qualquer E de um tipo referenciado. Vamos estruturar o nosso estudo neste capítulo em três etapas: 1. Estudar a interface List<E> e uma das suas implementações. 2. Estudar a interface Set<E> e suas implementações. 3. Estudar a interface Map<K,V> e duas das suas implementações. Em conjunto com a etapa 1, introduziremos o indispensável estudo dos tipos genéricos de JAVA e dos tipos parametrizados e sua utilização, que é um conhecimento fundamental para trabalharmos com toda a segurança, e de modo genérico e extensível, com estas colecções de JAVA.
8.3 Tipos genéricos Um tipo genérico é um tipo referenciado (classe ou interface) que usa na sua definição um ou mais tipos de dados (não primitivos) como parâmetro, tipos parâmetro esses que serão mais tarde substituídos por tipos concretos quando o tipo genérico for instanciado. A Figura 8.2 ilustra, através de um exemplo, as duas componentes de um tipo genérico.
© FCA - Editora de Informática
257
JAVA6 E PROGRAMAÇÃO ORIENTADA PELOS OBJECTOS
E
Stack Figura 8.2 – Tipo genérico Stack<E>
Um tipo genérico tem por parâmetros uma ou mais variáveis “de tipo” (parâmetros de tipo), e é definido com base nestas variáveis de valor não especificado (formais). A Figura 8.2 ilustra o tipo Stack<E>, em que a variável parâmetro E representa uma infinidade de possíveis tipos concretos (excepto tipos primitivos) ou parâmetros actuais de Stack. Um tipo parametrizado é o resultado de uma instanciação do tipo genérico para um valor concreto da variável de tipo E, por exemplo, Stack<String>, Stack<Ponto>, etc. O tipo parametrizado resultante da instanciação poderá então ser usado em declarações de variáveis, de parâmetros de métodos ou de tipos de resultado destes. É convenção usar-se uma única letra para os “parâmetros de tipo” dos tipos genéricos, em geral a letra E para parâmetros de tipo de colecções, e T e outras para os parâmetros de tipo de classes que não são colecções, por exemplo, Par<T, U>. Os tipos genéricos existem há muitos anos em muitas linguagens de programação sob várias formas de implementação, quer em linguagens funcionais (como ML, 1976) quer em linguagens orientadas aos objectos (como packages em ADA, templates em C++ e “genéricos” em C# 2.0), podendo mesmo, numa solução pobre, ser emulados por simples substituições de texto pré-compilação. Pode fazer-se o exercício com o texto de definição de Ponto<T> a seguir, que, apenas com boas substituições textuais, daria para criar em JAVA diversas classes Ponto de diferentes tipos: public class Ponto<T> { // tipo genérico Ponto<T> private T x; private T y; // Métodos public Ponto(T cx, T cy) { x = cx; y = cy; } public T daX() { return x; } public T daY() { return y; } public void setX(T cx) { x = cx } . . . }
Como se pode verificar pelo exemplo, nas classes genéricas, os métodos são também definidos tendo os tipos parâmetro por base, quer como parâmetros quer como resultados. A existência ou não de tipos genéricos não é, só por si, vantagem ou desvantagem, e este exemplo não só serve para dar uma ideia da estrutura interna do tipo de template que terá sempre um tipo genérico, como também para mostrar que o problema não está na sintaxe, nem na forma, mas na semântica, em especial na teoria de tipos associada à verificação da sua segurança pelo compilador, e até na execução. Quanto a estes pontos, os tipos para258
© FCA - Editora de Informática
COLECÇÕES E TIPOS PARAMETRIZADOS
metrizados de JAVA5 têm características próprias que referiremos no final do capítulo, depois de conhecermos melhor as formas como os podemos utilizar. Os tipos genéricos podem, em JAVA, ser quer classes quer interfaces. Em JAVA5, todas as classes e interfaces de JCF são parametrizadas, salvo as excepções, os tipos enumerados e classes especiais ditas anónimas. No entanto, e por questões que têm a ver com a designada retrocompatibilidade, por cada classe C<E> ou interface I<E> genérica, foram mantidas as versões antigas sem parâmetros C e I, que não são type-safe, ou seja, seguras em termos de tipos, e que não estudaremos nem devem ser usadas pois irão desaparecer em futuras versões da linguagem. Estes tipos designam-se por raw types. São exemplos os tipos (interfaces) List e Set e, entre outras, as implementações (classes) ArrayList e HashSet. Estas colecções, não tipadas, permitiam inserir um qualquer Object, sendo portanto heterogéneas, pois poderíamos ter na mesma colecção instâncias de múltiplas classes. Ao ler destas colecções seria sempre extraído um Object, devendo o programador realizar o casting para o tipo que esperava que o objecto tivesse de facto. Nada era pois verificado pelo compilador, a não ser que tudo era do tipo Object. Porque ainda existem as duas versões das classes e interfaces, parametrizadas e não parametrizadas, ao longo do texto, haverá sempre o cuidado de escrever C<E> ou C<> para que não se confundam com o raw type C (que gera warnings por ser inseguro). A variável de tipo E, em Stack<E> acima, pode ser também instanciada com um tipo parametrizado, por exemplo, List<String>, conduzindo a um tipo parametrizado de segundo nível, como Stack<List<String>>, uma stack de listas de String. Quando todas as variáveis de tipo de um tipo genérico são instanciadas com tipos concretos (argumentos de tipo), obtém-se um tipo parametrizado concreto. Como veremos posteriormente, há certas instanciações de tipos genéricos que conduzirão não a um tipo parametrizado concreto, mas a famílias de possíveis concretizações.
8.4 Listas de tipo e: List<E> Se uma interface define o conjunto de métodos (API) a implementar por uma classe que pretenda possuir tais características ou propriedades, então, a interface Collection<E> define o conjunto de métodos que qualquer grupo de objectos deverá implementar para que seja do tipo Collection<E>. Como podemos ver pela Figura 8.1, os mappings, apesar de serem colecções no sentido lato, não são do tipo Collection<E>, pois necessitam de duas variáveis de tipo, K e V, e os seus métodos possuem assinaturas em conformidade com as características deste tipo particular de estruturas de dados. Vamos de momento centrar a nossa atenção na interface List<E>. Esta interface herda de Iterable<E> e de Collection<E>. Todas as classes que implementam List<E> respondem aos métodos especificados na interface apresentados no Quadro 8.1: © FCA - Editora de Informática
259
JAVA6 E PROGRAMAÇÃO ORIENTADA PELOS OBJECTOS
Categoria de Métodos
API de List<E>
Inserção de elementos (resultado boleano)
add(E o); add(int index, E o); addAll(Collection); addAll(int i, Collection);
Remoção de elementos (resultado boleano)
remove(Object o); remove(int index); removeAll(Collection); retainAll(Collection)
Consulta e comparação de conteúdos
E get(int index); int indexOf(Object o); int lastIndexOf(Object o); boolean contains(Object o); boolean isEmpty(); boolean containsAll(Collection); int size();
Criação de Iteradores
Iterator<E> iterator(); ListIterator<E> listIterator(); ListIterator<E> listIterator(int index);
Modificação
set(int index, E elem); clear();
Subgrupo
List<E> sublist(int de, int ate);
Conversão
Object[] toArray();
Outros
boolean equals(Object o); Quadro 8.1 – API parcial de List<E>
A implementação de cada um destes métodos deve satisfazer o facto de que um “grupo de objectos” de tipo List<E> possui as seguintes propriedades: Existe uma ordem nos seus elementos, ou seja, é uma sequência ou lista de objectos de tipo E; Cada elemento ocupa uma posição na lista referenciada por um índice inteiro, a partir de 0; Os elementos podem ser inseridos em qualquer posição da lista; A lista pode conter elementos em duplicado e elementos null.
Existem quatro classes (exceptuando as classes de gestão) que implementam, de formas diferentes, a interface List<E>, ou seja, são implementações parametrizadas de listas:
ArrayList<E> (implementação em array dinâmico); Vector<E> (implementação de lista usando um array dinâmico); Stack<E> (estrutura com comportamento LIFO, last-in-first-out); LinkedList<E> (implementação em lista duplamente ligada).
Conforme se pode verificar observando a Figura 8.3, todas estas classes herdam da classe abstracta AbstractList<E> implementações parciais que completam, por forma a serem classes concretas e a satisfazerem a interface List<E>. A classe LinkedList<E> é ainda subclasse de outra classe abstracta que lhe impõe acesso sequencial (cf. “anterior” e “seguinte”). Vector<E> e ArrayList<E> são implementações semelhantes de listas, apenas diferindo pelo facto de que a classe Vector<E> é uma implementação especial designada por synchronized, para gestão de concorrência.
260
© FCA - Editora de Informática
COLECÇÕES E TIPOS PARAMETRIZADOS
Iterable<E>
AbstractCollection<E>
Collection<E>
List<E>
ArrayList<E>
AbstractList<E>
LinkedList<E>
Vector<E>
Stack<E>
Figura 8.3 – Implementações de List<E>
Uma classe com implementação synchronized é uma classe cujo código está preparado para ser executado num ambiente onde podem existir diversas threads (processos light ou tarefas) ou mesmo processos concorrentes, nos quais os acessos a uma estrutura de dados deve ser convenientemente escalonado e esta mantida coerente para os processos que lhe vão aceder posteriormente. Naturalmente que se não estamos a programar aplicações com este tipo de exigências, como é o nosso caso, não precisaremos de pagar o ónus da sincronização, que tem algum peso na eficiência. Em todo o caso, qualquer classe não sincronizada de raiz pode ser tornada synchronized pelo programador. A classe Stack<E> é implementada à custa de Vector<E> sendo, assim, sua subclasse. Estudaremos como exemplo de implementação de listas a classe ArrayList<E>, que é a mais utilizada, entre outras razões, pela sua eficiente implementação, que é redimensionável de forma automática.
8.4.1 Classe ArrayList<E> A classe ArrayList<E> corresponde a uma implementação de listas usando um array que é redimensionável, ou seja, pode crescer sempre que é necessário espaço para mais elementos, tal como pode diminuir à medida que elementos são removidos, naturalmente sem que o utilizador do arraylist tenha que se preocupar com tal aspecto (Figura 8.4). Tal como um array normal, um ArrayList<E> é uma estrutura indexada e, portanto, os seus elementos ocupam uma posição dada por um número inteiro a partir de 0. A primeira coisa que há que decidir, antes de se criar um arraylist usando os construtores disponíveis, é o tipo E dos seus elementos, sendo certo porém que nenhuma colecção de © FCA - Editora de Informática
261
JAVA6 E PROGRAMAÇÃO ORIENTADA PELOS OBJECTOS
JAVA armazena valores de tipos primitivos. Assim, o tipo E será um tipo qualquer válido excepto um tipo primitivo, e, portanto, será o nome de uma classe, de uma classe abstracta ou de uma interface (Figura 8.4). E
ArrayList
Figura 8.4 – ArrayList com tipo parâmetro E
Como primeiro exemplo simples, para melhor conhecermos as operações disponíveis para se manipularem objectos do tipo ArrayList<E>, vamos considerar que pretendemos de momento criar listas de nomes, sem grandes requisitos, mas com as usuais operações de procura, iteração, contagem, etc. Então, para este caso, E = String. Vamos, pois, criar objectos do tipo ArrayList<String>. A respectiva declaração de tipo, feita usando esta sintaxe, indica ao compilador que apenas objectos do tipo E poderão ser inseridos no arraylist. Um erro de compilação deverá ser produzido caso haja alguma instrução que tente inserir um objecto não String. Vamos agora criar várias listas de nomes, conforme o tipo de nomes. As declarações para criarmos os nossos arraylist de strings são então as seguintes: ArrayList<String> amigos = new ArrayList<String>(); ArrayList<String> musicos = new ArrayList<String>(); ArrayList<String> amigas = new ArrayList<String>(50);
Nos primeiros casos não nos preocupamos com a capacidade inicial (o mais usual), e, no último, indicamos uma capacidade inicial mínima de 50 elementos. Veremos adiante o terceiro construtor. Em todos os casos, podemos de imediato pretender calcular qual o número de elementos actual dos arraylists. O método size(), que é aplicável a todas as colecções, devolve tal valor inteiro, por exemplo, escrevendo: int tam1 = amigos.size(); int tam2 = amigas.size();
o que, em ambos os casos, devolveria o valor 0 (pois capacidade ≠ nº de elementos). Vamos agora inserir alguns nomes nas listas: o método mais simples para se realizar uma inserção numa lista é o método add(E elem) que junta o objecto parâmetro ao final da lista receptora e incrementa o número de elementos: amigos.add(new Integer(127)); // para teste amigos.add("Jorge"); amigos.add("Ivo"); …… amigas.add("Vera"); amigas.add("Rute"); ……
Conforme se esperava, qualquer tentativa de inserir no arraylist de String um objecto 262
© FCA - Editora de Informática
FICHA DE 7 REVISÃO
OBJECTIVO – Construção de uma árvore genealógica A maior parte das pessoas cria conteúdo que contém apenas texto, apesar de as ilustrações e gráficos ajudarem as audiências a compreender e a relembrar melhor, do que texto, a mensagem que se pretende passar. As funcionalidades do Word 2007 como smartarts e cliparts são uma ajuda preciosa na elaboração rápida de documentos ilustrados com aspecto profissional. No final deste exercício o utilizador deverá estar apto a realizar as seguintes operações:
© FCA – Editora de Informática
z
Inserir um smartart
z
Formatar um smartart
z
Inserir uma tabela rápida
z
Formatar uma tabela rápida
z
Inserir um clipart
Exercícios de Word 2007
229
F R 7
ENUNCIADO 1 - Elabore um esquema, com a informação apresentada em baixo, utilizando o
smartart “Hierarquia” da categoria “Hierarquia”. Eu Mariana Duarte Mãe Ana Ferreira
Pai Pedro Duarte
Avó Josefina Silva
Avô José Ferreira
Avó Natividade Novais
2 - Adicione uma forma na última linha do lado direito e escreva “Avô – Abel
Duarte”. 3 - Construa uma tabela com os dados seguintes utilizando o modelo “Lista
tabular”.
230
Parentesco Mãe Pai Avó materna Avô materno Avó paterna Avô paterno
Foto Clipart Clipart Clipart Clipart Clipart Clipart
4 - Elimine as duas últimas linhas da tabela. 5 - Altere a altura dos cliparts para 2 cm. 6 - Na coluna “Parentesco” alinhe a parte central à esquerda e na coluna “Foto”
alinhe os cliparts ao centro. 7 - Alinhe a tabela ao centro da folha. 8 - Guarde na pasta “Documentos” com o nome “Revisão 7”.
Exercícios de Word 2007
© FCA – Editora de Informática
F R 7
SOLUÇÃO
231
© FCA – Editora de Informática
Exercícios de Word 2007
F R 7
RESOLUÇÃO 1 - Para inserir um smartart começar por seleccionar o separador “Inserir” e, no
friso, na secção “Ilustrações” fazer clique no botão “Smartart”. Na nova janela, do lado esquerdo seleccionar “Hierarquia” e do lado direito seleccionar “Hierarquia”. Preencher cada uma das formas fazendo clique sobre elas e escrevendo a respectiva informação. 2 - Seleccionar a forma que contém a palavra “Avó – Natividade Novais” fazendo
clique sobre ela e fazer clique no separador “Estrutura”. No friso, na secção “Criar gráfico” fazer clique em “Adicionar forma” e seleccionar “Adicionar forma após”. Preencher com a palavra “Avô – Abel Duarte” fazendo clique sobre a forma e escrevendo. 3 - Para construir uma tabela a partir de um modelo começar por colocar o cursor
232
por baixo do smartart fazendo duplo clique com o botão esquerdo do rato naquele local. De seguida, fazer clique no separador “Inserir”, carregar no botão “Tabela”, seleccionar “Tabelas rápidas” e depois “Lista tabular”. Na coluna “Parentesco” escrever o grau de parentesco, utilizando o rato ou as teclas direccionais para mudar de célula. Na coluna “Foto” inserir o clipart referente à mãe, começando por fazer clique no separador “Inserir”. De seguida, no friso, na secção “Ilustrações”, fazer clique no botão”Clipart”. No painel da direita, em “Procurar:” escrever “mãe”, em “Procurar em:” seleccionar “Em todo o lado” e fazer clique no botão “Ir”. Por último, escolher um clipart e fazer clique sobre ele para o inserir no local onde se encontra o cursor. Repetir os passos anteriores para inserir os cliparts alusivos aos restantes graus de parentesco. 4 - Para eliminar as duas últimas linhas começar por seleccioná-las e, de seguida,
fazer clique no separador “Esquema”. No friso, na secção “Linhas e colunas”, fazer clique no botão “Eliminar” e seleccionar “Eliminar linhas”. 5 - Para alterar a altura do clipart começar por seleccioná-lo e fazer clique no separador
“Formatar”. No friso, na secção “Tamanho”, escrever 2 na caixa “Altura da forma”. Repetir os passos anteriores para alterar a altura dos restantes cliparts. 6 - Para proceder aos alinhamentos solicitados começar por seleccionar a primeira
coluna e fazer clique no separador “Esquema”. No friso, na secção “Alinhamento”,
Exercícios de Word 2007
© FCA – Editora de Informática
F R 7 fazer clique no botão “Alinhar a parte central à esquerda”. De seguida, seleccionar a segunda coluna e, no friso, na secção “Alinhamento”, fazer clique no botão “Alinhar ao centro”. 7 - Para alinhar a tabela ao centro da folha começar por seleccioná-la e fazer
clique no separador “Base”. No friso, na secção “Parágrafo”, fazer clique no botão “Ao centro”. 8 - Para guardar um documento na pasta “Documentos”, fazer clique no “Botão
do Office”, seleccionar “Guardar” e fazer clique em “Documento do Word”. Seleccionar a pasta “Documentos” e, em “Nome do ficheiro:”, escrever “Revisão 7”. Por último, fazer clique no botão “Guardar”.
233
© FCA – Editora de Informática
Exercícios de Word 2007
FICHA 36 OBJECTIVO – Modelo personalizado com marcas d’água Actualmente é possível criar e guardar um modelo personalizado em formato digital, que poderá, por exemplo, substituir o tradicional papel timbrado. Este será utilizado sempre que for necessário redigir um documento como, por exemplo, uma carta ou um fax. No final deste exercício o utilizador deverá estar apto a realizar a seguinte operação: z
© FCA – Editora de Informática
Construir um modelo de papel timbrado
Exercícios de Word 2007
251
F
36 ENUNCIADO 1 - Abra um documento novo e faça as seguintes alterações à folha:
•
Margem superior: 3 cm;
•
Margem inferior: 2 cm;
•
Margem esquerda: 2,5 cm;
•
Margem direita: 2 cm.
2 - Insira no cabeçalho, à esquerda, o texto: Escola “Os informáticos” e, por baixo,
uma linha contínua preta. 3 - Altere o tipo de letra para Courier New e o tamanho para 14. 4 - Insira no rodapé uma linha contínua preta. 5 - No rodapé, por baixo da linha, marque três tabulações à esquerda em 5 cm, 9
cm e 13,5 cm e preencha com a seguinte informação: R. Tomás Ribeiro, 34
1500-100 Lisboa
Telefone: 213 243 659
Fax: 213 243 660
6 - Altere o tipo de letra para Courier New e o tamanho para 8.
252
7 - Insira uma marca d’água com o texto “Exemplo”. 8 - Guarde na pasta “Documentos” com o nome “Ficha 36”.
Exercícios de Word 2007
© FCA – Editora de Informática
F
36 SOLUÇÃO
253
© FCA – Editora de Informática
Exercícios de Word 2007
F
36 RESOLUÇÃO 1 - Para modificar as margens da folha começar por fazer clique no separador
“Esquema de página”. No friso, fazer clique no botão “Margens” e seleccionar “Personalizar margens…”. Em “Superior:”, seleccionar 3, em “Inferior:”, seleccionar 2, em “Esquerda:”, seleccionar 2,5 e, em “Direita:”, seleccionar 2. Por último, fazer clique no botão “OK”. 2 - Para escrever na zona dos cabeçalhos e dos rodapés, fazer clique no separador
“Inserir”, de seguida, no friso, fazer clique no botão “Cabeçalho” e seleccionar “Em branco”. No cabeçalho, que aparece no topo de cada uma das páginas, escrever Escola “Os informáticos”. De seguida, fazer clique no separador “Base” e, no friso, na secção “Parágrafo”, fazer clique na seta à direita do botão com o limite inferior e seleccionar “Limite inferior”. 3 - Para alterar o tipo de letra começar por seleccionar o texto. De seguida, fazer
clique no separador “Base” e, no friso, na secção “Tipo de letra”, na caixa “Tipo de letra”, seleccionar “Courier New”. Para alterar o tamanho da letra do texto, no friso, na secção “Tipo de letra”, na caixa “Tamanho do tipo de letra” seleccionar 14. 4 - Para inserir uma linha contínua preta no rodapé, fazer clique no separador
254
“Inserir”, de seguida, no friso, fazer clique no botão “Rodapé” e seleccionar “Editar rodapé”. De seguida, fazer clique no separador “Base” e, no friso, na secção “Parágrafo”, fazer clique na seta à direita do botão com o limite inferior e seleccionar “Limite superior”. 5 - Começar por posicionar o cursor no rodapé, clicando à esquerda do mesmo.
Fazer clique sobre uma parte branca da régua e, de seguida, duplo clique sobre o símbolo preto que aparece, que é uma tabulação. Na janela “Tabulações”, fazer clique no botão “Limpar tudo”, para apagar a tabulação que acabou de criar bem como aquelas que o Word criou automaticamente. Escrever 5 na caixa “Marca de tabulação:”, seleccionar “À esquerda” na secção “Alinhamento” e “Nenhum” na secção “Carácter de preenchimento”, fazer clique no botão “Definir”. Escrever 9 na caixa “Marca de tabulação:”, seleccionar “À esquerda” na secção “Alinhamento” e “Nenhum” na secção “Carácter de preenchimento”, fazer clique no botão “Definir”. Escrever 13,5 na caixa “Marca de tabulação:”, seleccionar “À esquerda” na secção “Alinhamento” e “Nenhum” na secção “Carácter de preenchimento”. Fazer clique no botão “OK”. Após marcar as tabulações, escrever “R. Tomás Ribeiro, 34”, premir uma vez a tecla TAB, escrever Exercícios de Word 2007
© FCA – Editora de Informática
F
36 “1500-100 Lisboa”, premir novamente a tecla TAB, escrever “Telefone: 213 243 659”, premir mais uma vez a tecla TAB e escrever “Fax: 213 243 660”. 6 - Para alterar o tipo de letra começar por seleccionar o texto. De seguida, fazer
clique no separador “Base” e, no friso, na secção “Tipo de letra”, na caixa “Tipo de letra”, seleccionar “Courier New”. Para alterar o tamanho da letra do texto, no friso, na secção “Tipo de letra”, na caixa “Tamanho do tipo de letra” seleccionar 8. Fechar a zona de cabeçalho e rodapé fazendo clique no separador “Estrutura” e, de seguida, no botão “Fechar cabeçalho e rodapé”. 7 - Para inserir uma marca d’água começar por seleccionar o separador
“Esquema de página“. No friso, na secção “Fundo de página”, fazer clique no botão “Marca d’água” e seleccionar “Exemplo 1”. 8 - Para guardar um documento na pasta “Documentos”, fazer clique no “Botão
do Office”, seleccionar “Guardar” e fazer clique em “Documento do Word”. Seleccionar a pasta “Documentos” e, em “Nome do ficheiro:”, escrever “Ficha 36”. Por último, fazer clique no botão “Guardar”.
255
© FCA – Editora de Informática
Exercícios de Word 2007
624
AUTOCAD 2010 & AUTOCAD LT 2010 – CURSO COMPLETO
17.6.5 CRIAR SUPERFÍCIES E SÓLIDOS POR EXTRUSÃO O AutoCAD oferece vários comandos que permitem atribuir uma espessura (extrudir) a um objecto 2D. Quando a extrusão tem por base um perfil aberto, o resultado é uma superfície; quando a extrusão tem por base um perfil fechado, uma região ou uma superfície plana, o resultado é um sólido. Em seguida, descrevem-se os diferentes comandos que podem ser usados para extrudir objectos. 17.6.5.1 EXTRUDE
O comando E X T R U D E permite, por omissão, extrudir segundo uma altura perpendicular à geometria 2D que é seleccionada, mas também pode ser especificada outra direcção ou ser seleccionado um percurso (figura 17.48). Podem ser extrudidos perfis abertos ou fechados (segmentos de recta, arcos, polilinhas 2D, etc.), regiões e superfícies planas. São aceites como percursos as entidades lineares 2D ou 3D abertas ou fechadas, bem como as arestas de superfícies e de sólidos. Altura
Direcção
Percurso
FIGURA 17.48 – Modos de extrusão do comando EXTRUDE Quando uma extrusão é realizada segundo um percurso, este não deve possuir curvaturas muito fechadas e é deslocado para o centróide da geometria a extrudir. Para obter uma extrusão segundo um percurso, recomenda-se, em alternativa, o uso do comando S W E E P , descrito mais à frente neste capítulo, visto oferecer mais opções de controlo do efeito da extrusão.
Para accionar este comando, seleccione Extrude no painel Modeling do separador Home da Ribbon. Em alternativa, introduza E X T R U D E ou E X T na linha de comando ou seleccione Draw → Modeling → Extrude na barra de menus. Em primeiro lugar, o comando informa o número de linhas que são usadas na representação de faces curvas de sólidos (valor activo da variável I S O L I N E S ) e solicita a selecção das entidades a extrudir. Seleccione uma ou mais entidades e pressione Enter para terminar a selecção, após o que o objecto é criado.
© FCA – Editora de Informática