Equilibrar turmas

Ai galera!!
Tenho uma bd com varias tabelas k correspondem a varias turmas, ja tenho contadores d todas as tabelas, a duvida o prob é k ao inserir os dados as turmas devem xtar equilibradas em termos de alunos, ker dzr s eu tiver 3 turmas num mesmo ano uma turma n pode ter mtos alunos e outras poucos, sera k alguem poderia m dar uma mãozinha nisso?

[quote=VagnerChines]Ai galera!!
Tenho uma bd com varias tabelas k correspondem a varias turmas, ja tenho contadores d todas as tabelas, a duvida o prob é k ao inserir os dados as turmas devem xtar equilibradas em termos de alunos, ker dzr s eu tiver 3 turmas num mesmo ano uma turma n pode ter mtos alunos e outras poucos, sera k alguem poderia m dar uma mãozinha nisso?[/quote]

Uma solução simples seria pegar a turma que tem menos alunos e inserir um novo aluno nessa turma. Isso pode ser feito via query pedindo o min da quantidade de alunos. Se as turmas tiverem a mesma quantidade, então insere em uma qualquer.

É essa sua pergunta? Ou vc quer detalhes de implementação?

[]'s

tipo, eu keria saber s n ha uma maneira d antes d introduzir os dados mostar uma mensagem s tive um caso d uma turma tiver + d 5 alunos k a outra e direcionar p a k tem menos, p o caso d 3 tabelas

Legal…mas onde vc esta fazendo isso ??? Direto no banco , em php, em java ???

Qual é a sua implementação pra esse problema ??? Aproveitando o gancho…vc poderia deixar a preguiça de lado e escrever em português…q c acha…rs

Numa aplicação desktop do java

Oi homem de Luanda,

O que você acha desta idéia (em forma de algoritimo)?

  1. Obter o total de registros de cada turma (esse passo acho que vc já fez).

  2. Verificar qual turma tem o menor número de alunos.

  3. Incluir o aluno na primeira turma com menor quantidade de alunos (passo 2) que encontrar.

  4. Se todas as turmas estiverem com o mesmo número de alunos, selecionar uma turma aliatoriamente e incluir o novo aluno nesta turma.

  5. Na próxima inclusão de aluno iniciar no passo 1.

Outra dica é a seguinte: tente desenvolver o algoritimo utilizando listas (ArrayList ou outra) o código ficará pequeno e fácil de extrair a lógica, quando ela estiver dominada vc transfere para o sistema.

Um grande abraço

 try{ //tratamento de erros
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//Driver JDBC ? Fonte de Dados ODBC
        //conecta no BD, as aspas vazias representam o Login: usuário e senha.
        Connection con = DriverManager.getConnection("jdbc:odbc:ProjectoOp","","");
        Statement stmt = con.createStatement();       //objeto comdo sql
        
  ResultSet RS1 = stmt.executeQuery ("select count(Nome) from Turma_I1M");
  int countI1M = 0;
if (RS1.next()) {  // proxima (primeira) posicao
  countI1M = RS1.getInt(1);  // primeira coluna == 1 (nao 0 aqui!)
} else {
  // erro: dados nao lidos
}
 
 ResultSet RS2 = stmt.executeQuery ("select count(Nome) from Turma_I1T");
  int countI1T = 0;
if (RS2.next()) {  // proxima (primeira) posicao
  countI1T = RS2.getInt(1);  // primeira coluna == 1 (nao 0 aqui!)
} else {
  // erro: dados nao lidos
}
 ResultSet RS3 = stmt.executeQuery ("select count(Nome) from Turma_I1N");
  int countI1N = 0;
if (RS3.next()) {  // proxima (primeira) posicao
  countI1N = RS3.getInt(1);  // primeira coluna == 1 (nao 0 aqui!)
} else {
  // erro: dados nao lidos
}        
  int[] contagem = new int[3];
contagem[0] = countI1M;
contagem[1] = countI1T;
contagem[2] = countI1N;

int indice = 0;
int minimo = contagem[indice];
for (int i = 1; i < contagem.length; i++) {  // inicia com 1 pois 0 foi considerado acima
  if (contagem[i] < minimo) {
    indice = i;
    minimo = contagem[indice];
  }
}

System.out.println("turma com menor numero: " + indice);
            con.close();
      }  catch( SQLException e){ //trata os erros SQL
            JOptionPane.showMessageDialog(this, "Erro Cmdo SQL " + e.getMessage() );
            } catch( ClassNotFoundException e){      //trata erros de conexão
             JOptionPane.showMessageDialog( this, " Driver não encontrado " );
            } 

Aí, usei esse codigo, ele mostra a posição com menos alunos agora a duvida é como é k eu mostro a turma correspondente

Você poderia construir uma classe que descrevesse um objeto para cada turma, ex:

[code]public class Turma {
private int codigo = 0;
private String nome = null;
private int quantidadAlunos = 0;

public Turma(int codigo, String nome, int quantidadeAlunos) {
this.codigo = codigo;
this.nome = nome;
this.quantidadeAlunos = quantidadeAlunos;
}
// Getters e Setter aqui
}
[/code]

Ajustar o código seguinte para as outras turmas; o sql tem que ser ajustado para satisfazer o exemplo.

[code]ResultSet RS1 = stmt.executeQuery (“select count(Nome) from Turma_I1M”);
int countI1M = 0;
if (RS1.next()) { // proxima (primeira) posicao

Turma turmaI1M = new Turma( RS1.getInt(“codigo”), RS1.getString(“nome”), RS1.getInt(“quantidade”));

} else {
// erro: dados nao lidos
} [/code]

Turma[] turmas = new Turmas[3]; turmas[0] = turmaI1M; turmas[1] = turmaI1T; turmas[2] = turmaI1N;

int indice = 0; int minimo = turmas[indice].getQuantidadeAlunos(); for (int i = 1; i < turmas.length; i++) { // inicia com 1 pois 0 foi considerado acima if (turmas[i].getQuantidadeAlunos() < minimo) { indice = i; minimo = turmas[indice].getQuantidadeAlunos(); } }

System.out.println("Indice da turma com menor numero: " + indice); System.out.println("Código da turma com menor numero: " +turma[indice].getCodigo()); System.out.println("Nome da turma com menor numero: " +turma[indice].getNome()); System.out.println("Quantidade de alunos da turma com menor numero: " +turma[indice].getQuantidadeAlunos());

Espero ter ajudado.

flws

[quote=VagnerChines][code]
try{ //tratamento de erros
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);//Driver JDBC ? Fonte de Dados ODBC
//conecta no BD, as aspas vazias representam o Login: usuário e senha.
Connection con = DriverManager.getConnection(“jdbc:odbc:ProjectoOp”,"","");
Statement stmt = con.createStatement(); //objeto comdo sql

ResultSet RS1 = stmt.executeQuery (“select count(Nome) from Turma_I1M”);
int countI1M = 0;
if (RS1.next()) { // proxima (primeira) posicao
countI1M = RS1.getInt(1); // primeira coluna == 1 (nao 0 aqui!)
} else {
// erro: dados nao lidos
}

ResultSet RS2 = stmt.executeQuery (“select count(Nome) from Turma_I1T”);
int countI1T = 0;
if (RS2.next()) { // proxima (primeira) posicao
countI1T = RS2.getInt(1); // primeira coluna == 1 (nao 0 aqui!)
} else {
// erro: dados nao lidos
}
ResultSet RS3 = stmt.executeQuery (“select count(Nome) from Turma_I1N”);
int countI1N = 0;
if (RS3.next()) { // proxima (primeira) posicao
countI1N = RS3.getInt(1); // primeira coluna == 1 (nao 0 aqui!)
} else {
// erro: dados nao lidos
}
int[] contagem = new int[3];
contagem[0] = countI1M;
contagem[1] = countI1T;
contagem[2] = countI1N;

int indice = 0;
int minimo = contagem[indice];
for (int i = 1; i < contagem.length; i++) { // inicia com 1 pois 0 foi considerado acima
if (contagem[i] < minimo) {
indice = i;
minimo = contagem[indice];
}
}

System.out.println("turma com menor numero: " + indice);
con.close();
} catch( SQLException e){ //trata os erros SQL
JOptionPane.showMessageDialog(this, "Erro Cmdo SQL " + e.getMessage() );
} catch( ClassNotFoundException e){ //trata erros de conexão
JOptionPane.showMessageDialog( this, " Driver não encontrado " );
}
[/code]
Aí, usei esse codigo, ele mostra a posição com menos alunos agora a duvida é como é k eu mostro a turma correspondente
[/quote]

Vagner,

pelo que vi, você criou uma tabela para cada turma. A menos que exista uma boa justificativa para isso, esse não é um bom design. Se você precisar criar uma quarta turma, vai precisar criar mais uma tabela no banco e mudar o seu código, o que não é muito legal.

O ideal é você criar uma tabela chamada TURMA e dentro desta tabela você insere as turmas como registros. Dai voce cria uma outra tabela chamada ALUNO e insere os alunos, ligando eles a uma turma via chave estrangeira. Seu sistema vai ficar bem mais legal assim.

Mesmo que você esteja fazendo só pra aprendizado, recomendo fazer desse jeito que eu falei, para você já ir pegando os conceitos melhores.

Se você tiver alguma dúvida sobre isso que eu falei, é só perguntar.

[]'s