Bien, he aquí "una" de las soluciones: obviamente no hay 2 personas que piensen igual por lo tanto los algoritmos pueden variar, pero el resultado debería ser el mismo.
La pregunta #1 es sencilla:
Codificaremos la interface:
package com.ejemplo.jdbc;
import java.util.List;
public interface AlumnoIF {
public List<AlumnoDTO> calculaPromedio();
public void calculaPromedioCuartil_x_Sexo(float rango1, float rango2, String sexo);
public void calculaPromedioCuartil(float rango1, float rango2);
}
Luego necesitamos un DTO llamado "AlumnoDTO" :
package com.ejemplo.jdbc;
import java.io.Serializable;
public class AlumnoDTO implements Serializable {
private int id;
private String nombre;
private float ep;
private float ta;
private float pc;
private float promedio;
No olvidarse de generar lo getter/setter.
La pregunta #2 implica generar un DAO con la lógica de cada método definido en la interface:
package com.ejemplo.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class AlumnoDAO implements AlumnoIF {
private final String url = "jdbc:mysql://localhost:3306/1416examenfinal?user=root&password=mysql";
public Connection getConnection() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url);
} catch ( Exception e) {
System.out.println("* * * Ocurrio un ERROR " + e.getLocalizedMessage() );
e.printStackTrace();
}
return con;
}
Para calcular el promedio :
public List<AlumnoDTO> calculaPromedio() {
Connection con = getConnection();
String sql = "SELECT * FROM TBALUMNOS ORDER BY ID";
List<AlumnoDTO> lista = new ArrayList<AlumnoDTO>();
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// Borrar tabla
String sql0 = "DELETE FROM TBRPTA";
pstmt = con.prepareStatement(sql0);
pstmt.executeUpdate();
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
while ( rs.next() ) {
String sql2 = "INSERT INTO TBRPTA VALUES(?,?,?,?,?,?,?)";
pstmt = con.prepareStatement(sql2);
pstmt.setInt(1, rs.getInt(1) );
pstmt.setString(2, rs.getString(2) );
pstmt.setFloat(3, rs.getFloat(3) );
pstmt.setFloat(4, rs.getFloat(4) );
float pc1 = rs.getFloat(5);
float pc2 = rs.getFloat(6);
float pcMayor = 0;
if ( pc1 > pc2) {
pstmt.setFloat(5, pc1 );
pcMayor = pc1;
} else {
pstmt.setFloat(5, pc2 );
pcMayor = pc2;
}
float promedio = (float) (rs.getFloat(3) *0.3 + rs.getFloat(4) *0.4 + pcMayor *0.3);
pstmt.setFloat(6, promedio );
pstmt.setString(7, rs.getString(7).trim() );
pstmt.executeUpdate();
}
// Leer los resultados
String sql1 = "SELECT * FROM TBRPTA ORDER BY PROMEDIO ASC";
pstmt = con.prepareStatement(sql1);
rs = pstmt.executeQuery();
while ( rs.next() ) {
AlumnoDTO a = new AlumnoDTO();
a.setId( rs.getInt(1) );
a.setNombre( rs.getString(2) );
a.setEp( rs.getFloat(3) );
a.setTa( rs.getFloat(4) ) ;
a.setPc( rs.getFloat(5) ) ;
a.setPromedio(rs.getFloat(6));
lista.add(a);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pstmt.close();
rs.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return lista;
}
Para calcular el promedio por Cuartil :
public void calculaPromedioCuartil(float rango1, float rango2) {
Connection con = getConnection();
String sql = "SELECT promedio FROM TBRPTA WHERE promedio > ? AND promedio <= ?";
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = con.prepareStatement(sql);
pstmt.setFloat(1, rango1);
pstmt.setFloat(2, rango2);
rs = pstmt.executeQuery();
int contador = 0;
float suma = 0;
while ( rs.next() ) {
contador = contador + 1;
suma = suma + rs.getFloat(1);
}
System.out.println("CUARTIL : de " + rango1 + " a " + rango2 + " --> " + (suma/contador) ) ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pstmt.close();
rs.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Y para calcular el promedio por cuartil y sexo:
public void calculaPromedioCuartil_x_Sexo(float rango1, float rango2, String sexo) {
Connection con = getConnection();
String sql = "SELECT promedio FROM TBRPTA WHERE promedio > ? AND promedio <= ? AND sexo = ? ";
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = con.prepareStatement(sql);
pstmt.setFloat(1, rango1);
pstmt.setFloat(2, rango2);
pstmt.setString(3, sexo);
rs = pstmt.executeQuery();
int contador = 0;
float suma = 0;
while ( rs.next() ) {
contador = contador + 1;
suma = suma + rs.getFloat(1);
}
System.out.println("CUARTIL : de " + rango1 + " a " + rango2 + " Sexo : " + sexo + " --> " + (suma/contador) ) ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pstmt.close();
rs.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
La pregunta #3 implica crear el programa principal :
package com.ejemplo.pregunta02;
import java.util.List;
import com.ejemplo.jdbc.AlumnoDAO;
import com.ejemplo.jdbc.AlumnoDTO;
import com.ejemplo.jdbc.AlumnoIF;
public class Respuesta02 {
public static void main(String[] args) {
Respuesta02 r02 = new Respuesta02();
r02.calcula();
}
public void calcula() {
AlumnoIF dao = new AlumnoDAO();
List<AlumnoDTO> l = dao.calculaPromedio();
for (int i=0; i < l.size(); i++) {
System.out.println( l.get(i).getId() + "\t " + l.get(i).getNombre() + "\t " + l.get(i).getPc() + "\t" + l.get(i).getPromedio() );
}
// Promedio x Cuartiles
System.out.println("===> Primer Cuadro <====");
dao.calculaPromedioCuartil(0F, 25.00F);
dao.calculaPromedioCuartil(25.01F, 50.00F);
dao.calculaPromedioCuartil(50.01F, 75.00F);
dao.calculaPromedioCuartil(75.01F, 100.00F);
System.out.println("");
// Promedio x Cuartiles x Sexo
System.out.println("===> Segundo Cuadro <====");
dao.calculaPromedioCuartil_x_Sexo(0F, 25.00F,"H");
dao.calculaPromedioCuartil_x_Sexo(0F, 25.00F,"F");
dao.calculaPromedioCuartil_x_Sexo(25.01F, 50.00F,"H");
dao.calculaPromedioCuartil_x_Sexo(25.01F, 50.00F,"F");
dao.calculaPromedioCuartil_x_Sexo(50.01F, 75.00F,"H");
dao.calculaPromedioCuartil_x_Sexo(50.01F, 75.00F,"F");
dao.calculaPromedioCuartil_x_Sexo(75.01F, 100.00F,"H");
dao.calculaPromedioCuartil_x_Sexo(75.01F, 100.00F,"F");
}
}
Al ejecutar este programa salen todos los datos necesarios para llenar los cuadros.
¿ Fácil ?