Universidade Federal de Minas Gerais Instituto de Ciências Exatas Departamento de Ciência da Computação Algoritmos e Estruturas de Dados – 2a. Prova 1. Uma relação entre n elementos pode ser representada utilizando um arranjo de arranjos de booleanos. O arranjo de arranjos deve corresponder a uma matriz quadrada de tamanho n*n. Considere que r contém uma referência para tal arranjo. O componente r[i][j] é verdadeiro quando o elemento correspondente a i está relacionado com o elemento correspondente a j. Se r[i][j] é falso então i não se relaciona com j. Considere que relação {(α,α),(α,β),(α,δ),(δ,β},(δ,δ)} foi codificada com α correspondendo ao índice 0, β ao índice 1 e δ correspondendo ao índice 2. Dê a relação resultante, em termos de pares ordenados, após a invocação do método abaixo. static void m(boolean[][] r){ for(int x=0; x<r.length; x++) for(int y=0; y<r.length-1; y++) r[x][y]=r[x][y]&r[x][y+1]; } 2. Considere a classe Naipe definida abaixo. class Naipe { private final String nome; private Naipe(String nome) { this.nome = nome; } public String toString() { return nome; } public static final Naipe PAUS = new Naipe("paus"); public static final Naipe OUROS = new Naipe("ouros"); public static final Naipe COPAS = new Naipe("copas"); public static final Naipe ESPADAS = new Naipe("espadas"); } Quando usamos esta classe quatro e apenas quatro objetos do tipo Naipe são criados. Considere a variável n1declarada abaixo Naipe n1=Naipe.PAUS; Faça um desenho seguindo as convenções vistas em sala de aula, da estrutura em memória referenciada pela variável n1. No seu desenho não deve faltar a variável n1, a classe Naipe e os objetos do tipo Naipe. Você não deve mostrar a classe String, nem a classe Object. Exceções só devem ser usadas em situações excepcionais! O trecho de programa abaixo é um exemplo do uso incorreto de exceções. Reescreva o trecho abaixo de forma a obter o mesmo efeito mas em conformidade com a boa disciplina. try{ int i=0; while(true) m(s.charAt(i++)); }catch(IndexOutOfBoundsException e){} 3. 4. O que faz o método abaixo? Seja conciso e evite vícios de linguagem. Não parafraseie o código. Não descreva os casos excepcionais. Dê exemplo, considere que ele recebe um caminho para um diretório contendo os arquivos x.java, y.java, x.class, y.txt e o arranjo {“java”, “class”}. “infeliz”.substring(2) retorna “feliz”. “infeliz”.lastIndexOf(‘i’) retorna 5. static int[] m(File f, String[] s){ if(!f.isDirectory()) return null; if(s==null) return null; int[] r=new int[s.length]; File[] ac=f.listFiles(); String n,e; for(int i=0; i<ac.length; i++){ if(ac[i].isFile()){ n=ac[i].getName(); e=n.substring(n.lastIndexOf('.')+1); for(int j=0; j<s.length; j++) if(s[j].equals(e)) r[j]++; } } return r; } 5. 6. 7. 8. A expressão e instanceof t é verdadeira caso a expressão e seja do tipo t (p.ex. System.in instanceof java.io.InputStream é verdadeira). O método abaixo imprime todos os elementos de uma coleção. Reescreva o método de forma a imprimir apenas os elementos da coleção que são do tipo String. Minimize sua intervenção. static void m(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) System.out.println(i.next()); } O método abaixo recebe uma referência para uma instância de coleção, assume que os elementos da coleção sejam instâncias de String e retorna um arranjo de Strings correspondentes à coleção recebida. Complete o comando for. static String[] conv(Collection c){ if(c==null) return null; Iterator i=c.iterator(); String[] r=new String[c.size()]; for(________________________) r[j]=(String)i.next(); return r; } O método abaixo utiliza o método conv() que converte uma coleção em um arranjo de Strings (desculpem o vício de linguagem). O que faz o método abaixo? Seja conciso. Dê exemplo, considere que ele recebe um caminho para um diretório contendo os arquivos x.java, y.java, x.class, y.txt . Não parafraseie o código. Não descreva os casos excepcionais. static String[] m(File f){ if(!f.isDirectory()) return null; Set c=new HashSet(); File[] ac=f.listFiles(); String n; for(int i=0; i<ac.length; i++){ n=ac[i].getName(); if(ac[i].isFile()) c.add(n.substring(n.lastIndexOf('.')+1)); } return conv(c); } O desenho abaixo mostra um estado de uma das implementações de coleção discutidas na disciplina. cntElem 2 nd extr info ant prox info ant prox info ant prox Faça um desenho de uma instância do iterador desta coleção logo após a execução de Iiterador i=nd.iterador(); seguido de i.proximo();. O desenho deve incluir a variável i e a instância do iterador detalhando os campos, valores e referências. O desenho acima deve ser transcrito para sua folha de resposta. class IteradorLDE implements Iiterador{ Cnodo curr=extr.prox; Cnodo refAnt=null; public boolean temProximo(){ return curr!=extr; } public int proximo(){ if(curr==extr) throw new NoSuchElementException(); refAnt=curr; curr=curr.prox; return refAnt.info; } public void remove(){ if(refAnt==null) throw new NoSuchElementException(); cntElem--; refAnt.prox.ant=refAnt.ant; refAnt.ant.prox=refAnt.prox; refAnt=null; } } public Iiterador iterador(){return new IteradorLDE();}