Você está na página 1de 8

Fundação CECIERJ – Vice Presidência de Educação Superior a Distância

Curso de Tecnologia em Sistemas de Computação


Disciplina: Programação Orientada a Objetos
AP2 1° semestre de 2020.

Nome –

Assinatura –

Observações:
1. As respostas precisam ser entregues de forma manuscrita e a caneta.
2. Utilize qualquer folha em branco para transcrever suas respostas. Dê
preferência a folhas pautadas (com linhas). Assine em cada folha que utilizar.
3. Estas folhas devem ser escaneadas e enviadas pela plataforma. Certifique-se
de que estejam legíveis. Utilize algum aplicativo para escanear, como o
CamScanner, de forma que o(s) arquivo(s) fique(m) pequeno(s).
4. Não seja o plágio do que ouve, vê, lê por aí. Estilo é plagiar a si mesmo
(Última frase é atribuída a Alfred Hitchcock).

Questão 1) (5.0 pontos)


Escreva um programa em Java que receba, como parâmetro de entrada do seu programa,
um arquivo texto com várias matrizes “sem classificação”, descubra a classe de cada
matriz do arquivo e as imprima de acordo com a classe a que elas pertençam. As classes
aceitas nesta questão são as seguintes:
→Linha: formada por uma única linha;
→Coluna: formada por uma única coluna;
→Quadrada: formada por matrizes com o mesmo número de linhas e de colunas;
→Simétrica: ocorre quando o elemento da linha i e coluna j é igual ao elemento da
linha j e coluna i, para todos os elementos dessa matriz;
→Triangular: quando todos os elementos ou acima, ou abaixo da diagonal principal são
iguais a zero (se uma matriz possuir todos os elementos iguais a zero, essa matriz será
considerada Simétrica);
→Identidade: ocorre quando os elementos da diagonal principal são todos iguais a um e
os demais elementos são iguais a zero;
→Hadamard – H(n): é uma matriz de elementos booleanos (isto é, elementos 0 e 1),
onde n é potência de dois, que satisfaça a seguinte propriedade: dadas duas linhas
distintas i e k, onde 0 <= i < n e 0 <= k < n, desta matriz, a quantidade de
elementos distintos nestas linhas é sempre igual a n/2. A seguir exemplica-se H(1),
H(2) e H(4). Para construir H(n), divide-se a matriz H(n) em quatro partes iguais,
chamadas de quadrantes, repete-se três vezes a matriz H(n/2) nos quadrantes de menores
índices, e no quadrante de maiores índices de H(n), inverte-se a matriz H(n/2); e
H(1) | H(2) | H(4)
---------|--------|------------
1 | 1 1 | 1 1 1 1
| 1 0 | 1 0 1 0
| 1 1 0 0
| 1 0 0 1
→ NRA: sem nenhuma das classificações supracitadas.

Segue um exemplo de arquivo. A linha em branco que aparece na ENTRADA e na SAÍDA


só aparecem para esclarecer as respostas obtidas pelo algoritmo solicitado:
ENTRADA SAÍDA
2 1 COLUNA
0
0 LINHA

1 2 IDENTIDADE
0 0
NRA
2 2
1 0 SIMÉTRICA
0 1
SIMÉTRICA
2 3
1 2 3 TRIANGULAR
0 0 0
HADMARD
2 2
1 0
HADMARD
0 0
SIMÉTRICA
2 2
1 2
2 0

2 2
1 0
3 4

2 2
1 1
1 0

1 1
1

1 1
3
Em sua solução, você deve criar as classes supracitadas, usando os conceitos de OO.
Ademais, SEU PROGRAMA SÓ PODE LER O ARQUIVO DE ENTRADA UMA ÚNICA
VEZ, E ELE DEVE EXECUTAR COM QUAISQUER ARQUIVOS, QUE SEGUEM O
FORMATO DE ENTRADA SUPRACITADO, COMO PARÂMETRO DE ENTRADA. SE
O SEU PROGRAMA RESOLVER SOMENTE O EXEMPLO SUPRACITADO, SUA
QUESTÃO SERÁ TOTALMENTE DESCONTADA.

RESPOSTA:
import java.io.*;
import java.util.*;

class Matriz{
int lin, col;
int[][] matriz;

Matriz(int l, int c){


lin = l;
col = c;
matriz = new int[l][c];
}

Matriz(int l, int c, int[][] m){


lin = l;
col = c;
matriz = m;
}

public String toString(){


int i, j;
String resp = "Matriz com " + lin + " linhas e " + col + "
colunas:\n";
for(i = 0; i < lin; i++){
for(j = 0 ; j < col; j++) resp += matriz[i][j] + " ";
resp += "\n";
}
return resp;
}
}

class Linha extends Matriz{


Linha(int c, int[][] m){ super(1, c, m); }

public String toString(){ return "LINHA"; }


}

class Coluna extends Matriz{


Coluna(int l, int[][] m){ super(l, 1, m); }

public String toString(){ return "COLUNA"; }


}

class NRA extends Matriz{


NRA(int l, int c, int[][] m){ super(l, c, m); }
public String toString(){ return "NRA"; }
}

class Quadrada extends Matriz{


Quadrada(int l, int[][] m){ super(l, l, m); }

Quadrada(int l){ super(l, l); }

public String toString(){ return "QUADRADA"; }


}

class Triangular extends Quadrada{


Triangular(int l, int[][] m){ super(l, m); }

public String toString(){ return "TRIANGULAR"; }


}

class Hadamard extends Quadrada{


Hadamard(int l, int[][] m){ super(l, m); }

public String toString(){ return "HADAMARD"; }


}

class Simetrica extends Quadrada{


Simetrica(int l, int[][] m){ super(l, m); }

public String toString(){ return "SIMETRICA"; }


}

class Identidade extends Simetrica{


Identidade(int l, int[][] m){ super(l, m); }

public String toString(){ return "IDENTIDADE"; }


}

public class Q1_AP2_2020_1{


public static void main(String[] args) throws IOException{
BufferedReader in;
in = new BufferedReader(new FileReader(args[0]));
try{
List<Matriz> l = new ArrayList();
String s = in.readLine();
while(s != null){
String vs[] = s.split(" ");
int lin = Integer.parseInt(vs[0]), i, j;
int col = Integer.parseInt(vs[1]);
int mat[][] = new int[lin][col];
for(i = 0; i < lin; i++){
s = in.readLine();
vs = s.split(" ");
for(j = 0; j < col; j++)
mat[i][j] = Integer.parseInt(vs[j]);
}
Matriz teste = new Matriz(lin, col, mat);
if(eLinha(teste)) l.add(new Linha(col, mat));
else if(eColuna(teste)) l.add(new Coluna(lin, mat));
else if(eQuadrada(teste)){
if(eHadamard(teste)) l.add(new Hadamard(lin, mat));
else if(eSimetrica(teste)){
if(eIdentidade(teste)) l.add(new Identidade(lin, mat));
else l.add(new Simetrica(lin, mat));
}
else if(eTriangular(teste))
l.add(new Triangular(lin, mat));
else
l.add(new Quadrada(lin, mat));
}
else l.add(new NRA(lin, col, mat));
s = in.readLine();
}
in.close();
Iterator<Matriz> iterator = l.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
} catch (Exception e) { System.out.println("Excecao\n"); }
}

static boolean eLinha (Matriz mat){


if((mat.lin == 1) && (mat.col > 1)) return true;
return false;
}

static boolean eColuna (Matriz mat){


if((mat.col == 1) && (mat.lin > 1)) return true;
return false;
}

static boolean eNRA (Matriz mat){


if((mat.col > 1) && (mat.lin > 1) && (mat.col != mat.lin))
return true;
return false;
}

static boolean eQuadrada (Matriz mat){


if(mat.col == mat.lin) return true;
return false;
}

static boolean eSimetrica (Matriz mat){


int i, j;
for(i = 0; i < mat.lin; i++)
for(j = 0; j < i; j++)
if(mat.matriz[i][j] != mat.matriz[j][i]) return false;
return true;
}
static boolean eIdentidade(Matriz mat){
boolean resp = eSimetrica(mat);
if(!resp) return false;
int i, j;
for(i = 0; i < mat.lin; i++){
if(mat.matriz[i][i] != 1) return false;
for(j = 0; j < i; j++)
if(mat.matriz[i][j] != 0) return false;
}
return true;
}

static boolean eHadamard(Matriz mat){


Matriz had = new Quadrada(mat.lin);
int i, j, k;
had.matriz[0][0] = 1;
for(k = 1; k < mat.lin; k += k)
for(i = 0; i < k; i++)
for(j = 0; j < k; j++){
had.matriz[i+k][j] = had.matriz[i][j];
had.matriz[i][j+k] = had.matriz[i][j];
if(had.matriz[i][j] == 0) had.matriz[i+k][j+k] = 1;
else had.matriz[i+k][j+k] = 0;
}
for(i = 0; i < mat.lin; i++)
for(j = 0; j < mat.lin; j++)
if(mat.matriz[i][j] != had.matriz[i][j]) return false;
return true;
}

static boolean eTriangular(Matriz mat){


boolean resp = eSimetrica(mat);
if(resp) return false;
int i, j, soma_inf = 0, soma_sup = 0;
for(i = 0; i < mat.lin; i++)
for(j = 0; j < i; j++){
soma_inf += mat.matriz[i][j];
soma_sup += mat.matriz[j][i];
}
if((soma_inf == 0) || (soma_sup == 0)) return true;
return false;
}
}

Questão 2) (5.0 pontos)


Suponha o código abaixo:

public class AP2_2020_1_Q2 {


public static void main(String[] args) {
//Nome e url
Recurso link1 = new Link("Página Principal",
"https://www.cecierj.edu.br/");
Recurso link2 = new Link("GNU", "ftp://gnu.mirror.iweb.com/");
//Nome, url e tamanho da imagem em kbytes
Imagem logo = new Imagem("Logo da Página",
"https://www.cecierj.edu.br/wp-content/uploads/2019/08/logo-cecierj-1.png",
50);
Pagina pagina = new Pagina();
pagina.adicionaRecurso(link1);
pagina.adicionaRecurso(link2);
pagina.adicionaRecurso(logo);
System.out.println(pagina);
}
}

Implemente as classes/interfaces necessárias para que o código acima funcione.


Recurso (3a e 4a linhas) possui um método não definido (abstrato) chamado valido(), o
qual retorna verdadeiro quando o recurso se tratar de uma imagem e terminar com jpg ou
png, ou quando o recurso for um link e contiver a string www. Caso o recurso não seja
válido, ele não pode ser adicionado a página. Para o exemplo acima, apenas link1 e logo
são adicionados. Todas as classes devem possuir métodos toString() específicos a estas,
de forma que a impressão da página possa ser feita de forma polimórfica. Utilize os
conceitos de OO vistos sempre que possível para, por exemplo, evitar redundância no
código.

RESPOSTA:
import java.util.ArrayList;
import java.util.List;

// 1 Pto. para definição como classe abstrata ou interface


interface IRecurso { // Opcional
boolean valido();
}

abstract class Recurso implements IRecurso {


String nome;

public Recurso (String nome) {


this.nome = nome;
}

public String toString() {


return "Nome: " + nome;
}

// abstract boolean valido(); Alternativa a interface


}

// 1 Pto. para definição correta da classe Link


class Link extends Recurso {
String url;
public Link (String nome, String url) {
super(nome);
this.url = url;
}
// Implementação do método abstrato
public boolean valido() {
return this.url.contains("www");
}

// Definição do método reutilizando método herdade (super)


public String toString() {
return super.toString() + " Url: " + this.url;
}
}

// 1 Pto. para definição correta da classe Imagem


class Imagem extends Link {
int tamanho;
public Imagem (String nome, String url, int tamanho) {
super(nome, url);
this.tamanho = tamanho;
}

// Implementação do método abstrato


public boolean valido() {
return this.url.endsWith("jpg") || this.url.endsWith("png");
}

// Definição do método reutilizando método herdade (super)


public String toString() {
return super.toString() + " Tamanho: " + this.tamanho;
}
}

// 2 Ptos. para definição correta da classe Link


class Pagina {
// Poderia ser qualquer tipo de coleção para armazenar recursos (tipo
abstrato de Imagem e Link)
List <Recurso> recursos;

public Pagina() {
recursos = new ArrayList<Recurso>();
}

public void adicionaRecurso(Recurso r) {


// Verificação polimórfica se um recurso é valido. Polimórfica
pois, ora chama o método de Link, ora chama o método de Imagem.
if (r.valido())
recursos.add(r);
}

public String toString() {


String retorno = "";
// Implementação do retorno das strings também de forma
polimórfica.
for (Recurso r : recursos)
retorno += r.toString() + "\n";
return retorno;
}
}

Você também pode gostar