Lista de Exercícios 2¶
Classes¶
(Exercícios do professor André Santanchè.)
1. Escreva uma classe cujos objetos representam alunos matriculados em uma disciplina. Cada objeto dessa classe deve guardar os seguintes dados do aluno: matrícula, nome, 2 notas de prova e 1 nota de trabalho. Escreva os seguintes métodos para esta classe:
média: calcula a média final do aluno (cada prova tem peso 2,5 e o trabalho tem peso 2)
final: calcula quanto o aluno precisa para a prova final (retorna zero se ele não for para a final)
public class Aluno{
private int matricula;
private String nome;
private double n1, n2, trabalho;
public Aluno(int m, String n, double n1, double n2, double t){
matricula = m;
nome = n;
this.n1 = n1;
this.n2 = n2;
trabalho = t;
}
public double media(){
return ((n1+n2)*2.5+trabalho*2)/7;
}
public double aFinal(){
double media = media();
if(media<2.5 || media>=5)
return 0;
return 10-media;
}
}
//Para deixar o resultado para apenas duas casas decimais:
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}
//Utilização
Aluno eu = new Aluno(123, "Léo", 8, 1, 5);
System.out.println("A média é: "+round(eu.media(),2)+" e é necessário mais "+round(eu.aFinal(),2)+" para ser aprovado.");
2. A linguagem Java dispõe de um suporte nativo a vetores, que exige a definição de seu tamanho no
momento da instanciação. Depois de instanciado, o tamanho do vetor não pode ser modificado. Escreva
uma classe chamada Vetor
cujos objetos simulem vetores de tamanho variável. A classe define os
seguintes métodos:
construtor: recebe como parâmetro o tamanho inicial do vetor.
insert: recebe como parâmetro uma string e a coloca na próxima posição disponível do vetor; note
que o vetor cresce automaticamente, portanto, se a inserção ultrapassar o tamanho inicial
estabelecido na criação, por exemplo, o vetor deve aumentar seu tamanho
automaticamente.
get: recebe como parâmetro uma posição do vetor e retorna a string que estiver naquela
posição; se a posição não estiver ocupada ou ultrapassar o tamanho do vetor, este método
retorna nulo.
size: retorna o número de elementos inseridos no vetor (independente do tamanho do mesmo).
public class Vetor{
int n = 0,
t = 0;
String v[];
public Vetor(int t){
if(t<1)
return;
this.t = t;
v = new String[t];
}
public void insert(String s){
if(n+1>t)
duplique();
v[n++] = s;
}
private void duplique(){
if(t<1)
t = 1;
t *= 2;
String novo[] = new String[t];
for(int i = 0; i<n; i++)
novo[i] = v[i];
v = novo;
}
public String get(int i){
if(i<0 || i>n-1)
return null;
return v[i];
}
public int size(){
return n;
}
}
//Utilização
Vetor meuVetor = new Vetor(2);
System.out.println("Tamanho: "+meuVetor.size());
System.out.println("Posição 0: "+meuVetor.get(0));
System.out.println("Posição 1: "+meuVetor.get(1));
System.out.println("Posição 2: "+meuVetor.get(2));
System.out.println();
meuVetor.insert("Ser");
System.out.println("Tamanho: "+meuVetor.size());
meuVetor.insert("ou");
System.out.println("Tamanho: "+meuVetor.size());
meuVetor.insert("não ser");
System.out.println("Tamanho: "+meuVetor.size());
System.out.println();
System.out.println("Posição 0: "+meuVetor.get(0));
System.out.println("Posição 1: "+meuVetor.get(1));
System.out.println("Posição 2: "+meuVetor.get(2));
System.out.println("Posição 3: "+meuVetor.get(3));
3. Crie uma classe VetorOrdenado
que é uma variante da classe anterior, com as seguintes modificações
e acréscimos:
insert: recebe uma string como parâmetro e a insere em uma posição tal que o vetor de nomes se
mantenha sempre em ordem alfabética.
merge: recebe como parâmetro um outro objeto da classe VetorOrdenado
e retorna um terceiro objeto
da classe VetorOrdenado
(criado dentro do método) que contém o merge do vetor corrente com
aquele recebido como parâmetro.
public class VetorOrdenado{
int n = 0,
t = 0;
String v[];
public VetorOrdenado(int t){
if(t<1)
return;
this.t = t;
v = new String[t];
}
public void insert(String s){
int i;
boolean achou = false;
String aux = "", aux2;
if(n+1>t)
duplique();
//Percorra todo o vetor v
for(i = 0; i<n && !achou; i++){
//Percorra os caracteres de s
int k = 0;
for(; k<s.length() && k<v[i].length() && !achou; k++){
//Se o caractere k do elemento i de v for maior que caractere k de s
if (Character.toLowerCase(v[i].charAt(k)) > Character.toLowerCase(s.charAt(k))){
achou = true;
}
else //Se for menor, vá para próxima palavra
if (Character.toLowerCase(v[i].charAt(k)) < Character.toLowerCase(s.charAt(k)))
break;
}
//Verifique se não achou porque s é igual a v[i-1] até a posição k-1
//Nesse caso, s será colocado na posição i-1
if(!achou)
if(k>=s.length())
achou = true;
}
aux = s;
if(achou){
aux = v[i-1];
v[i-1] = s;
for(int k = i; k < n; k++){
aux2 = v[k];
v[k] = aux;
aux = aux2;
}
}
v[n++] = aux;
}
private void duplique(){
if(t<1)
t = 1;
t *= 2;
String novo[] = new String[t];
for(int i = 0; i<n; i++)
novo[i] = v[i];
v = novo;
}
public String get(int i){
if(i<0 || i>n-1)
return null;
return v[i];
}
public int size(){
return n;
}
public VetorOrdenado merge(VetorOrdenado s){
//Crie um vetor que possa comportar v e s.v[]
int n2 = s.size();
VetorOrdenado resultado = new VetorOrdenado(n+n2);
for (int a = 0; a < n; a++)
resultado.insert(v[a]);
for (int a = 0; a < n2; a++)
resultado.insert(s.get(a));
return resultado;
}
}
//Utilização
VetorOrdenado v1 = new VetorOrdenado(2);
VetorOrdenado v2 = new VetorOrdenado(2);
v1.insert("Mar");
v1.insert("Azul");
v1.insert("Aman");
v1.insert("Cor");
System.out.println("Tamanho de v1: "+v1.size());
v2.insert("Dia");
v2.insert("Ama");
v2.insert("Poema");
v2.insert("Verde");
v2.insert("Verdade");
v2.insert("Instante");
System.out.println("Tamanho de v2: "+v2.size());
VetorOrdenado v3 = v1.merge(v2);
System.out.println("Tamanho de v3: "+v3.size());
System.out.println();
for(int i = 0; i<v3.size(); i++)
System.out.print(v3.get(i)+" ");