Prova - UFMG

Propaganda
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();}
Download