[Ajuda] Sistema de ponto

Olá pessoal…

Eu e meu grupo estamos num fazendo um trabalho escolar de java o qual consiste num sistema simples de ponto eletrônico. Eis os links do codigo:

http://www.paste.la/46316 // Classe Pessoa
http://www.paste.la/46317 // Classe Funcionario
http://www.paste.la/46318 // Classe Administrador
http://www.paste.la/46319 // Classe MaquinaDePonto
http://www.paste.la/46320 // Classe Sistema

Encontramos os seguintes bugs:

Cadastro de 2 funcionarios. Acesso o menu do 1º, tudo bem. Quando coloco
o 2º pra logar, dá erro

Impossível sair totalmente do programa

Acreditamos que o problema está nos menus. O que vocês acham?

Gostaríamos de saber como consertá-los

Cara, em vez disso…

Funcionario[] lista = new Funcionario[100];

Porq vc nao usa Isso?..


ArryList<Funcionario> funcionarios = new ArrayList<Funcionario>;

e depois que vc cadastrou esse cara… vc só adiciona ele no seu array

assim…


funcionarios.add(f);

assim vc pode atribuir funcionarios sem definir posição no teu array … ele vai dinamicamente… colocando um atraz do outro … acredito que vai te economizar um bom trabalho !

Opa, cheguei agora. Também sou do grupo do cara que postou a dúvida. Agradeço ao sotarelli pela primeira dica.
Em relação a criar uma ArrayList, nós já tentamos mas o problema é que não temos idéia de como os funcionários irão fazer o login. Os funcionários devem fazer o login com uma matricula e uma senha. Então, utilizamos um vetor do tipo Funcionario, para os logins serem feitos através de um laço for + um if para comparação das matriculas e senhas digitadas com as salvas nos objetos do vetor. Ficou desta maneira o login:

// Login de um funcionário

 System.out.println("Digite sua matrícula: ");
 int m = sc.nextInt();
 System.out.println("Digite sua senha: ");
 String s = sc.next();
 for(int i = 0; i<= 99; i++){
    if((adm.lista[i].getMatricula() == m)&&(adm.lista[i].getSenha().equals(s))){

// Menu e etc...

Alguem pode dar alguma ideia de como podemos fazer o esquema do login, utilizando ArrayList? Uma ArrayList tem posições como um vetor (ex.: lista[5]) para podermos utilizar um laço for?

Agradeço desde já aos que ajudarem.

na verdade o que vc esta fazendo é varrendo seu array list em busca de um funcionario que se encaixe na matricula e senha digitada certo!?

usando um ArrayList, seu FOR vai ficar dessa maneira…


System.out.println("Digite sua matrícula: ");   
int m = sc.nextInt();   
System.out.println("Digite sua senha: ");   
String s = sc.next(); 

for(Funcionario funDaVez : funcionarios){ // funcionarios é o seu arrayLis populado com os funcionarios cadastrados
    if((funDaVez.getMatricula() == m)&&(funDaVez.getSenha().equals(s))){   
}

Abraço

for(int i=0; i<listaMensagens.size(); i++){
      texto += listaMensagens.get(i).getConteudo()+"\n";
}

listaMensagens é um arrayList, prestando atenção na declaração:

ArrayList<Mensagem> listaMensagens = new ArrayList<Mensagem>();

eu defino que esse arrayList vai ser do tp de Mensagem, vai guardar apenas objeto do tipo da classe Mensagem, assim consigo acessar os metodos do objeto Mensagem como o getConteudo().

Mudanças importantes para adaptação ao ArrayList:

Administrador.java

// imports novos!!!
import java.util.ArrayList;
import java.util.List;

public class Administrador extends Funcionario {
    // Atributos + + + + + + + + + + + + + + + + + +

    // modificado!!!
    // use ArrayList
    // Funcionario[] lista = new Funcionario[100];
    List<Funcionario> lista = new ArrayList<Funcionario>();

    private int matricula = 123;
    private String senha = "123";

    // removido!!
    // private int numfunc = 0;

    // Construtores + + + + + + + + + + + + + + + + +

    public Administrador() {
	// removido!!!
	/*
	 * for (int i = 0; i <= 99; i++) { lista[i] = new Funcionario(); }
	 */
    }

    // Métodos GET + + + + + + + + + + + + + + + + + +

    @Override
    public int getMatricula() {
	return this.matricula;
    }

    @Override
    public String getSenha() {
	return this.senha;
    }

    // removido!!!
    /*
     * public int getNumFunc() { return this.numfunc; }
     */

    // Métodos SET + + + + + + + + + + + + + + + + + +
    @Override
    public void setMatricula(int m) {
	this.matricula = m;
    }

    @Override
    public void setSenha(String s) {
	this.senha = s;
    }

    // removido!!!
    /*
     * public void setNumFunc(int n) { this.numfunc = n; }
     */

    // Métodos do ADM + + + + + + + + + + + + + + + + +
    public void cadastrarFunc(Funcionario f) {
	// modificado!!!
	/*
	 * lista[numfunc] = f; numfunc++;
	 */
	lista.add(f);
    }

    public void pagarFunc(Funcionario f) {
	if (f.pagEfetuado() == false) {
	    f.setSalario(f.getHorasTrab() * f.getPrecoDaHora());
	    f.setPagEfetuado(true);
	}
    }

    public void definirPrecoDaHora(Funcionario f, double p) {
	f.setPrecoDaHora(p);
    }

}

Seus menus estavam muito confusos. É preciso praticamente refazê-los:

MaquinaDePonto.java

/*
 * Sem dúvida, o problema está na classe MaquinaDePonto, na parte do menu:
 *
 * Além das devidas modificações sugeridas por [b]sotarelli[/b], 
 * reveja alguns pontos em especial:
 */

import java.util.Calendar;
import java.util.Scanner;
import java.util.GregorianCalendar;

public class MaquinaDePonto {
    // Declaração de OBJETOS + + + + + + + + + + + + + + + +

    Scanner sc = new Scanner(System.in);
    GregorianCalendar gc = new GregorianCalendar();
    Administrador adm = new Administrador();

    // Atributos + + + + + + + + + + + + + + + + + + + + + + + + + +

    double horadechegada;
    double horadesaida;
    Funcionario aux;

    public MaquinaDePonto() {
	adm.setMatricula(200);
	adm.setSenha("abc");
    }

    // Métodos MENU PRINCIPAL + + + + + + + + + + + + + + + + + + + + +

    public void menuPrincipal() {
	int op = 0;
	do {
	    System.out.println("1. Bater Ponto");
	    System.out.println("2. Acessar Menu");
	    System.out.println("3. Sair");
	    System.out.print(">>> ");
	    op = sc.nextInt();
	    // modificado!!!
	    switch (op) {
	    case 1:
		System.out.println("Bater Ponto");
		baterPonto();
		break;

	    case 2:
		System.out.println("Acessar menu");
		acessarMenu();
		break;

	    case 3:
		System.out.println("Encerrar programa");
		System.exit(0);
		break;

	    default:
		System.out.println("Opção inválida");
		break;
	    }

	    // modificado!!!
	} while (op != 3);
    }

    public void baterPonto() {
	System.out.println("Digite sua matrícula: ");
	int m = sc.nextInt();
	System.out.println("Digite sua senha: ");
	String s = sc.next();
	// bloco MUITO modificado!
	// modificado!!!
	for (Funcionario f : adm.lista) {
	    if ((f.getMatricula() == m) && (f.getSenha().equals(s))) {
		if (!f.estaLogado()) {
		    System.out.println("Chegada - Batida de ponto confirmada");
		    f.setEstaLogado(true);
		    // modificado!!!
		    horadechegada = gc.get(Calendar.HOUR_OF_DAY)
			    + ((double) gc.get(Calendar.MINUTE) / 60);
		    // menuPrincipal();
		} else {
		    System.out.println("Saída - Batida de ponto confirmada");
		    f.setEstaLogado(false);
		    // modificado!!!
		    horadesaida = (gc.get(Calendar.HOUR_OF_DAY) + ((double) gc
			    .get(Calendar.MINUTE) / 60));
		    // menuPrincipal();
		}
	    } else {
		System.out.println("Senha ou matricula incorreta");
		// menuPrincipal();
		// break;
	    }

	}

    }

    public void acessarMenu() {
	int op = 0;
	do {
	    System.out.println("1. Menu do Administrador");
	    System.out.println("2. Menu do Funcionário");
	    System.out.println("3. Voltar");
	    op = sc.nextInt();
	    // modificado!!!
	    String s;
	    int m;
	    switch (op) {
	    case 1:
		System.out.println("Digite sua matricula: ");
		m = sc.nextInt();
		System.out.println("Digite sua senha: ");
		s = sc.next();
		if ((adm.getMatricula() == m) && (adm.getSenha().equals(s))) {
		    System.out.println("Logado como adm");
		    menuDoAdm();
		} else {
		    System.out.println("Matricula ou senha incorreta");
		}
		break;

	    case 2:
		System.out.println("Digite sua matricula: ");
		m = sc.nextInt();
		System.out.println("Digite sua senha: ");
		s = sc.next();
		for (Funcionario f : adm.lista) {
		    if ((f.getMatricula() == m) && (f.getSenha().equals(s))) {
			aux = f;
			System.out.println("Logado como Funcionario");
			menuDoFunc();
			break;
		    } else {
			System.out.println("Matricula ou senha incorreta");
		    }
		}
		break;

	    case 3:
		break;

	    default:
		System.out.println("Opção inválida");
		break;
	    }
	    // modificado!!!
	} while (op != 3);
	// menuPrincipal();
    }

    // Métodos dos SUB-MENUS + + + + + + + + + + + + + + + + + + + + +

    public void menuDoAdm() {
	int op = 0;
	do {
	    System.out.println("1. Cadastrar Funcionário");
	    System.out.println("2. Pagar Funcionário");
	    System.out.println("3. Definir Preço da Hora");
	    System.out.println("4. Deslogar");
	    op = sc.nextInt();
	    int m;
	    switch (op) {
	    case 1:
		System.out.println("Cadastrar Funcionário");
		Funcionario f = new Funcionario();
		System.out.println("Digite a matricula do novo funcionario: ");
		f.setMatricula(sc.nextInt());
		System.out.println("Digite a senha do novo funcionario: ");
		f.setSenha(sc.next());
		System.out.println("Digite o nome do novo funcionario: ");
		f.setNome(sc.next());
		System.out
			.println("Digite a data de nascimento do novo funcionario: ");
		f.setDataDeNascimento(sc.next());
		System.out.println("Digite o sexo do novo funcionario: ");
		f.setSexo(sc.next());
		System.out.println("Digite o CPF do novo funcionario: ");
		f.setCpf(sc.next());
		adm.cadastrarFunc(f);
		break;

	    case 2:
		System.out.println("Pagar Funcionário");
		System.out
			.println("Digite a matricula do funcinário que será pago: ");
		m = sc.nextInt();
		for (Funcionario fun : adm.lista) {
		    if (fun.getMatricula() == m) {
			if (!fun.pagEfetuado())
			    adm.pagarFunc(fun);
			else
			    System.out.println("Este funcionário ja foi pago");

		    }
		}
		break;

	    case 3:
		System.out.println("Definir preço da hora");
		System.out
			.println("Digite a matricula do funcinário que será definido seu preco por hora de trabalho: ");
		m = sc.nextInt();
		for (Funcionario i : adm.lista) {
		    if (i.getMatricula() == m) {
			System.out
				.println("Digite o preco da hora de trabalho para este funcionário: ");
			double p = sc.nextDouble();
			adm.definirPrecoDaHora(i, p);
		    }
		}
		break;

	    default:
		break;
	    }

	} while (op != 4);
	menuPrincipal();
    }

    public void menuDoFunc() {
	int op = 0;
	do {
	    System.out.println("1. Ver Horas Trabalhadas");
	    System.out.println("2. Ver Salário");
	    System.out.println("3. Deslogar");
	    op = sc.nextInt();
	    switch (op) {
	    case 1:
		System.out.println("Você já trabalhou " + aux.getHorasTrab()
			+ " horas neste mês");
		break;

	    case 2:
		System.out.println("Seu salário é " + aux.getSalario()
			+ " reais por mês");
		break;

	    case 3:
		break;

	    default:
		System.out.println("Opção inválida");
		break;
	    }

	} while (op != 3);
    }

}

E a parte do tempo trabalhado, me parece não estar funcionando…

Primeiramente, gostaria de agradecer a todos que ajudaram.
Fiz uma ArrayList de funcionários e ajeitei toda a parte do cadastro dos novos funcionários. Porém, ainda tenho problemas com o cadastro de mais de um funcionário. Tipo assim: Eu rodo o programa > Acesso o menu do Administrador > Cadastro dois funcinários. Depois disso, deslogo o adm e vou bater o ponto com o primeiro funcionario cadastrado e funciona numa boa. Mas se eu tentar bater de outro funcionario não dá certo.

Segue o novo codigo fonte das classes MaquinaDePonto e Administrador:

http://www.paste.la/46577 - Classe Administrador
http://www.paste.la/46584 - Classe MaquinaDePonto

Alguem sabe por que não conseguimos cadastrar mais funcionários?
Sobre os menus, realmente estão muito bagunçados e nem sei se é por causa deles que não consigo cadastrar mais funcionários…
Na verdade, nosso professor nem explicou direito como devemos fazer menus. Se alguem puder nos dar uma dica sobre como podemos fazer menus mais decentes ficaremos gratos.

OBS. Ainda não fiz as mudanças que marcobiscaro2112 sugeriu…

Aew galera, modifiquei algumas coisas de acordo com o que marcobiscaro2112 sugeriu. Vou ajeitar os menus agora e procurar por bugs.

Saudações galera do GUJ! Vim aqui pedir ajuda novamente.
Desisti do projeto postado lá em cima e comecei a fazer outro. Estou fazendo este novo projeto no BlueJ e por enquanto ainda não criei nenhum menu. O novo projeto está encaminhando bem, sendo que me deparei com um problema relacionado a hora. Um dos objetivos do meu programa é calcular as horas trabalhadas por um funcionario. A lógica que eu usei foi pegar a hora de saída do funcionário e subtrair a hora de chegada dela. O resto dessa subtração, no caso, seria a quantidade de horas trabalhadas. No entanto, as horas trabalhadas sempre está dando zero, ou seja, a hora de saida ta sendo a mesma da hora de entrada. Estou importanto a classe Calendar para trabalhar com a hora. Segue abaxi o código fonte do novo projeto:

http://www.paste.la/49443 - Classe Pessoa
http://www.paste.la/49444 - Classe Funcionário
http://www.paste.la/49446 - Classe Administrador
http://www.paste.la/49447 - Classe MaquinaDePonto

Ainda não há uma classe main, pois estou testando o projeto no próprio BLueJ. A classe principal do programa é a classe MaquinaDePonto e é lá onde está o problema com a hora.
Agradeço antecipadamente aos que ajudarem.

Provavelmente o problema é que você cria apenas uma instância de Calendar quando o construtor é chamado. Suponhamos que o construtor seja chamado agora (14:00). Logo, ao chamar o método baterPonto, que por sua vez chama o método getHora obteremos:
Ao funcionário chegar no serviço e bater o ponto pela primeira vez, o getHora retornará 14.
Quando o funcionário for bater ponto para sair, o getHora ainda retornará 14 (porque a instância de Calendar é a mesma!). Para resolver isso, sugiro que elimine a linha 24 e passe o código que estava nessa linha para a linha 118 (logo no início do método getHora, para que este retorne a hora ATUAL, e não a hora em que o construtor foi chamado).

E convenhamos: com ArrayList ficou muito mais legível e organizado…

Muito obrigado Marco Biscaro. A parte da hora está funcionado perfeitamente. Graças a sua ajuda, nosso projeto conseguiu caminhar. Valeu mesmo cara.
E sobre esse novo projeto, a iniciativa de fazer um novo foi minha, já que o resto do grupo desistiu do projeto e iriamos tirar um 0.
Agora vem a parte mais difícil: a construção dos menus!

Criei um software sob licença gpl como trabalho do meu curso, Sistemas de Informação na USP Leste, que consistia num sisteminha de banco de horas simplório usando java + banco de dados mysql via jdbc. Havendo interesse, e no caso da minha pessoa encontrar o código-fonte do sisteminha, posso postar aqui…

Inté.

coloque o cod aí p/ gente.

Narcinho, voce pode me enviar o Projeto completo por e.mail. por favor, para que eu possa estudar o codigo., pois nao consigo baixar neste endereço.

meu: e.mail : gilvanlaurentino@ig.com.br

Muito obrigado.

[quote=nascinho]Olá pessoal…

Eu e meu grupo estamos num fazendo um trabalho escolar de java o qual consiste num sistema simples de ponto eletrônico. Eis os links do codigo:

http://www.paste.la/46316 // Classe Pessoa
http://www.paste.la/46317 // Classe Funcionario
http://www.paste.la/46318 // Classe Administrador
http://www.paste.la/46319 // Classe MaquinaDePonto
http://www.paste.la/46320 // Classe Sistema

Encontramos os seguintes bugs:

Cadastro de 2 funcionarios. Acesso o menu do 1º, tudo bem. Quando coloco
o 2º pra logar, dá erro

Impossível sair totalmente do programa

Acreditamos que o problema está nos menus. O que vocês acham?

Gostaríamos de saber como consertá-los[/quote]

Opa, estou aqui cumprindo algumas promessas…

Eis o código-fonte do projeto na forma dum projeto do eclipse dentro de um arquivo zip. Tem um arquivo de texto de nome “manual-wtb.txt” que serve de manual.
Não inclui o driver jdbc para conectar no mysql 5.0 no arquivo zip, mas esse driver é necessário para rodar o software corretamente.

Inté.

Eu comecei a fazer um como hobby, mas vai usar flex, qualquer coisa depois irei publicar