Problemas com métodos

31 respostas
Thais1
eu tenho que fazer um programa que calcule a comissao atraves do salario total de varios vendedores

mas tipo, eu fiz um while no metodo main, pq tenho q repetir a tarefa de pedir os dados do funcionário enquanto a resposta para a pergunta (tem outro?) seja s. tenho q mostrar o salario medio total(salario fixo mais comissao) dos vendedores do sexo feminino. então coloquei

int mulheres=0;

double salFem=0;

Daí, dentro do while (onde tem outras tarefas, não  essa) eu coloquei:

while(quant==s||quant==S)

{

a=inter.pegueVendedor();

double salFixo=a.informeSalarioFixo();

double comissao=a.fornecaComissao();

double salarioTotal=a.informeSalarioTot(comissao);
char sexo=a.informeSexo();

if(sexo==f||sexo==F)

{

mulheres++;

salFem+=salarioTotal;

}

e depois de fechar o while, eu coloquei

if(mulheres==0)

inter.mostre(Nao ha funcionarios do sexo feminino);

else

{	

double salMedioFem=salFem/mulheres;

inter.mostre("O salario medio total dos funcionarios do sexo feminino e: "+salMedioFem);

}

p.s(desculpa se o meu tópico ñ está dentro das regras, mas me ajuda por favoor!! :shock:)

31 Respostas

Thais1

O problema é q ele faz td certinho… mas não mostra no final! comofas?

DavidUser

por favor coloque os codigos na tag code assim facilita a leitura.

coloque o código por completo com suas variáveis reais dessa forma não podemos encotrar os erros de programação da sua classe nem sugerir melhoras.

tente usar um único while e compare a string recebida na janela:

String quant="s"; //necessária atribuição do valor "s" ou "S" para iníciar a gravação
while (quant.equals("s")||quant.equals("S")){// aqui pode adicionar o número que quiser de valores aceitos para continuar a gravação utilizando o "ou ( | )"
         //seu codigo ...
         System.out.println("Sua gravação!"); //exemplo para mostrar como esta sendo gravado o descrito
 
         quant=JOptionPane.showInputDialog(null,"tem outro?");
}
DavidUser

Caso ainda não seja o erro, informe o código por completo assim acharei os erros de programação e a solução para seu problema.

Thais1

Já vi o erro, era a forma q eu tava fazendo que tava errado.. mas olha só, agora, eu tenho q mostrar o vendedor de menor salario fixo(com tds os seus dados).. mas tipo,
Vendedor a=interface.pegueVendedor();
[code]Vendedor menorSalario=null;
double menor= que valor eu coloco akii??;

if(salFixo<=menor)
{
menor=salFixo;
menorSalario=a;
}

DavidUser
Já vi o erro, era a forma q eu tava fazendo que tava errado.. mas olha só, agora, eu tenho q mostrar o vendedor de menor salario fixo(com tds os seus dados).. mas tipo, Vendedor a=interface.pegueVendedor(); [code]Vendedor menorSalario=null; double menor= que valor eu coloco akii??;

if(salFixo<=menor)
{
menor=salFixo;
menorSalario=a;
}


faltou fechar a tag com "[ /code] "

Por favor insira as duas classes Pai e Parente(a de gravação)

senão não é possivel ajudar

Thais1
<blockquote>public class Principal

{

public static void main(String[]p)

{

Interface inter=new Interface();

Vendedor a;

char quant =s;

int mulheres=0;

double salFem=0.0;

Vendedor menorSalario=null;

double menor=1000;
while(quant=='s'||quant=='S')
	{
		a=inter.pegueVendedor();
		double salFixo=a.informeSalarioFixo();
		double comissao=a.fornecaComissao();
		double salarioTotal=a.informeSalarioTot(comissao);
		
		if(salFixo<=menor)
		{
				menor=salFixo;
				menorSalario=a;
		}		
				
			
		char sexo=a.informeSexo();
		if(sexo=='f'||sexo=='F')
		{
			mulheres++;
			salFem+=a.informeSalarioTot(comissao);

		}
					
		
		inter.mostreFuncionario(a.informeNome(), a.informeSalarioFixo(), comissao, salarioTotal);
		
		quant=inter.pecaOutro("Tem outro, (s/n)?");	
	}
	
	inter.mostreMenorSalario("O funcionario com menor salario fixo e: ",menorSalario, menorSalario.informeSalarioTot(comissao));
	
	if(mulheres==0)
		inter.mostre("Nao ha funcionarios do sexo feminino");
	else
	{	
		double salMedioFem=salFem/mulheres;
		inter.mostre("O salario medio total dos funcionarios do sexo feminino e: "+salMedioFem);
	}
}

}

tá aí…

DavidUser

leia o forum inicial deste, ele te ensina a utilizar os recursos de exibição da mensage:
assim: (abri a tag code e fechei com [b]/code[b])

public class Principal 
{ 
public static void main(String[]p) 
{ 
Interface inter=new Interface(); 
Vendedor a; 
char quant ='s'; 
int mulheres=0; 
double salFem=0.0; 
Vendedor menorSalario=null; 
double menor=1000; 


while(quant=='s'||quant=='S') 
{ 
a=inter.pegueVendedor(); 
double salFixo=a.informeSalarioFixo(); 
double comissao=a.fornecaComissao(); 
double salarioTotal=a.informeSalarioTot(comissao); 

if(salFixo<=menor) 
{ 
menor=salFixo; 
menorSalario=a; 
} 


char sexo=a.informeSexo(); 
if(sexo=='f'||sexo=='F') 
{ 
mulheres++; 
salFem+=a.informeSalarioTot(comissao); 

} 


inter.mostreFuncionario(a.informeNome(), a.informeSalarioFixo(), comissao, salarioTotal); 

quant=inter.pecaOutro("Tem outro, (s/n)?"); 
} 

inter.mostreMenorSalario("O funcionario com menor salario fixo e: ",menorSalario, menorSalario.informeSalarioTot(comissao)); 

if(mulheres==0) 
inter.mostre("Nao ha funcionarios do sexo feminino"); 
else 
{ 
double salMedioFem=salFem/mulheres; 
inter.mostre("O salario medio total dos funcionarios do sexo feminino e: "+salMedioFem); 
} 
} 


}
DavidUser

sem querer ofender mais tem de melhor a organização na hora da construção de seus códigos!

Thais1
public class Principal
{
	public static void main(String[]p)
	{
		Interface inter=new Interface();
		Vendedor a;
		char quant ='s';
		int mulheres=0;
		double salFem=0.0;
		Vendedor menorSalario=null;
		double menor=1000;
		
		
		while(quant=='s'||quant=='S')
		{
			a=inter.pegueVendedor();
			double salFixo=a.informeSalarioFixo();
			double comissao=a.fornecaComissao();
			double salarioTotal=a.informeSalarioTot(comissao);
			
			if(salFixo<=menor)
			{
					menor=salFixo;
					menorSalario=a;
			}		
					
				
			char sexo=a.informeSexo();
			if(sexo=='f'||sexo=='F')
			{
				mulheres++;
				salFem+=a.informeSalarioTot(comissao);

			}
						
			
			inter.mostreFuncionario(a.informeNome(), a.informeSalarioFixo(), comissao, salarioTotal);
			
			quant=inter.pecaOutro("Tem outro, (s/n)?");	
		}
		
		inter.mostreMenorSalario("O funcionario com menor salario fixo e: ",menorSalario, menorSalario.informeSalarioTot(comissao));
		
		if(mulheres==0)
			inter.mostre("Nao ha funcionarios do sexo feminino");
		else
		{	
			double salMedioFem=salFem/mulheres;
			inter.mostre("O salario medio total dos funcionarios do sexo feminino e: "+salMedioFem);
		}
	}
	
	
}
DavidUser

nuss! muito melhor!
Agora sim

DavidUser

Kd a classe Interface?
coloca ai

Thais1
import javax.swing.JOptionPane;
public class Interface
{
	public Interface()
	{
	}
	public char pecaOutro(String ms)
	{
		char o='m';
		while (o!='s'&&o!='S'&&o!='n'&&o!='N')
		{
			String outro=JOptionPane.showInputDialog(ms);
			o=outro.charAt(0);
			if(o!='s'&&o!='S'&&o!='n'&&o!='N')
				JOptionPane.showMessageDialog(null,"Resposta invalida");
		}		
				 
		return o;
	}	
		
	public Vendedor pegueVendedor()
	{
		String nome=JOptionPane.showInputDialog("Digite nome do vendedor: ");
		
		char sexo='n';
		while (sexo!='f'&& sexo!='F'&& sexo!='m' && sexo!='M')
		{
		 	String sex=JOptionPane.showInputDialog("Digite sexo (F/M): ");
		 	sexo=sex.charAt(0);
		 	if(sexo!='f'&& sexo!='F'&& sexo!='m' && sexo!='M')
		 		JOptionPane.showMessageDialog(null,"Valor invalido");
		 }
		  
		 double salarioFixo=-1.0;
		 while(salarioFixo<0)
		 {
		 	String sal=JOptionPane.showInputDialog("Digite o salario fixo");
		 	salarioFixo=Double.parseDouble(sal);
		 	if(salarioFixo<0)
		 		JOptionPane.showMessageDialog(null,"Valor invalido");
		 }
		 
		 double valorDasVendas=-1.0;
		 while(valorDasVendas<0)
		 {
		 	String vendas=JOptionPane.showInputDialog("Digite o valor das vendas do respectivo funcionario: ");
		 	valorDasVendas=Double.parseDouble(vendas);
		 	if(valorDasVendas<0)
		 		JOptionPane.showMessageDialog(null,"Valor invalido");
		 }				 		
		 		
		 return new Vendedor (nome, sexo, salarioFixo, valorDasVendas);
	} 
	
	public void mostreFuncionario(String name, double salarioFix, double comiss, double salarioTot)
	{
		JOptionPane.showMessageDialog(null,"Funcionario: " +name+ "\n Salario fixo: " +salarioFix+ "\n Comissao: " +comiss+ "\n Salario Total: " +salarioTot);
	}
	
	public void mostre(String msg)
	{
		JOptionPane.showMessageDialog(null, msg);
	}
	
	public void mostreMenorSalario(String m, Vendedor menorSalario, double salTot)	
    {
     	
     	  
        JOptionPane.showMessageDialog(null,m+menorSalario.informeNome()+
                             "\n Salario fixo:  "+menorSalario.informeSalarioFixo()+
                             "\n Comissao:  "+menorSalario.fornecaComissao()+
                             "\n Salario total:  "+salTot);
                             
    }
    
    	
}

a interface..

import javax.swing.JOptionPane;
public class Vendedor
{
	protected String nome;
	protected char sexo;
	protected double salarioFixo;
	protected double valorDasVendas;
	
		
	public Vendedor(String vNome,char vSexo, double vSalarioFixo,double vDasVendas)
	{
		nome=vNome;
		sexo=vSexo;
		salarioFixo=vSalarioFixo;
		valorDasVendas=vDasVendas;
	}
	
	public void modifiqueValorNome(String vNome)
    {
        nome=vNome;
    }
	
	public String informeNome()
	{
		return nome;
	}
	
	
	public void modifiqueValorSexo(char vsexo)
	{
		if(vsexo=='f'&&vsexo=='F'&&vsexo=='m'&&vsexo=='M')
			sexo=vsexo;
	}
	public char informeSexo()
	{
		return sexo;
	}
	
	
	public void modifiqueSalarioFixo(double vsal)
	{
		if(vsal>=0)
			salarioFixo=vsal;
		 
	}
	public double informeSalarioFixo()
	{
		return salarioFixo;
	}
	
	
	public void modifiqueValorDasVendas(double vVendas)
	{
		if(vVendas>=0)
			valorDasVendas=vVendas;
		
	}
	public double informeValorDasVendas()
	{
		return valorDasVendas;
	}	 			 			 
	
	public double fornecaComissao()
	{
		double comissao=0.0;
		if (valorDasVendas<10000)
			comissao=((double)5/100)*valorDasVendas;
		if(valorDasVendas>=10000||valorDasVendas>30000)
			comissao=((double)7/100)*valorDasVendas;
		if(valorDasVendas>=30000)
			comissao=(8.5/100)*valorDasVendas;
			
		return comissao;
	}
	
	public double informeSalarioTot(double comiss)
	{
		double salarioTot=salarioFixo+comiss;
		return salarioTot;
	}
				
}
e a vendedor..
Thais1

o valor do double menor teria q ser mt grande, maior do que qualquer valor q o usuario iria colocar para um salario… então eu coloquei tipo… 100000000000000.00
e agora o erro tá dando na linha 42 da Principal =S

DavidUser

que salário é esse q vc ta medindo!
Bill Gates?

Thais1

hehe, é q é o usuário quem vai colocar o salário né… daí sabe-se lá o q ele vai colocar… e tipo, cada valor de vendas ele recebe uma comissão, se for acima de 30 mil, a comissão é de 8,5%… então, botei um valor grande meio que pra garantir q ele não iria colocar um maior… mas meu professor é bem exigente, ele quer a critica dos dados e td mais…

Thais1
Já resolvii :D é q eu tinha q inicializar as variaveis fora do while..
double comissao=0.0;
		double salarioTotal=0.0;
		
		while(quant=='s'||quant=='S')
		{
			a=inter.pegueVendedor();
			double salFixo=a.informeSalarioFixo();
			comissao=a.fornecaComissao();
			salarioTotal=a.informeSalarioTot(comissao);
pra poder usá-las no final.. Mas, mt obrigada mesmo assim :D
DavidUser

não tem erro nenhum!
ta que vc fez tempestade em copo d’agua, pois podia ter feito com 2 classe uma adicionando e outra testando mais não tem erro não

DavidUser

Há é por isso então!
ele estava declarando as variáveis apenas para o primeiro run.

Thais1

Sim, mas acontece que é um trabalho, e como eu dissse, tem q ser da maneira que o professor quer…
por exemplo, no último q a gente entregou, só 2 pessoas da sala vão tirar nota boa, pq era pra fazer uma classe relógio que mudasse as hrs, e a gente ñ levou em conta q o usuário poderia considerar um horário maior que 24h, ou menor que 0… e isso tbm com os minutos e segundos… =S
a gente tá aprendendo de uma forma, então tem q seguir isso, pelo menos na aula dele… =S

DavidUser

Vc tem sim um bom raciocínio mais tente organizar melhor seu código.
Aconselho a criar apenas um Pai e apenas uma classe parente para a função desejada(ler,inoformar,etc…).

Assim vc evita o POG que complica em questão de manutenção do código.

Tente criar os métodos com execução de interfaces de gravação no própio método principal da classe de cadastro, recursos Swing ficam no método principal.(para em casos de bug, saber onde modificar o error sera descrito na saída).

DavidUser

Acho q não é bem isso que ele quis dizer de errado, o errado esta no resultado da ação e não no como é estruturado, no caso do tal relógio se tivessem inserido mais uma função para dias e específicado o código desde segundos até horas e como dito dias; ele teria aceitado pois as funções do tal relógio estavam completas.

Sem critícar os métodos do seu professor pessa para ele informar qual o resultado esperado por ele, é assim que se trabalha na construção de um software o cliente informa o que deseja e você constrói como quiser (de preferência do modo mais leve e volátiu).

Thais1

Sim, a gente perguntou… mas é que na verdade ele tinha dito q a partir da aula q ele ensinou a fazer os metodos de acesso, a critica dos dados… era pra gente colocar em tds os trabalhos isso… só que td mundo esqueceu :S

DavidUser

ha! assim então ele fez o correto!

Todos os seres humanos nascem com especifidades, tente todos os modos e programe do modo que seu cérebro melhor aceita não tente seguir um padrão ou isso diminui sua rendibilidade.

Bons estudos :wink:

Thais1

Hey, tem alguma forma de fazera critica dos dados, tipo… se o usuário digitar um número para o nome, informar q o dado está incorreto?
Bons estudos pra vc tbm :wink:

DavidUser

claro q sim! O java possui uma infinidade de recursos oferecidos por seus pacotes.
da uma olhada aqui estão todos.(esse é o manual da sun)

DavidUser
tive uma idéia use o try cath
try{
//testa condição
catch(Exeption e){
//se erro, faça...
}
[code]

eu fiz um exemplo assim:

[code]String x;
        x="";
        try{
        if (Integer.parseInt(x)!=0)System.out.println("valor inteiro");
        }
        catch(Exception e){
            System.out.println("INCOPATÍVEL");//se ele é uma string não pode ser convertido em um valor inteiro diferente de 0.
        }
        if (Integer.parseInt(x)/1!=0)System.out.println("teste");
você pode fazer o mesmo para uma string do modo inverso.
DavidUser
ta ai ele responde se é um inteiro ou uma string:
public static void main(String[]args){
        String x;
        x="";
        boolean tipo;
        try{
        if (Integer.parseInt(x)!=0) System.out.println("Integer");
        tipo=true;
        if (x.equals("0"))System.out.println("Integer");
        }
        catch(Exception e){
            System.out.println("String");
        tipo=false;
        }
        System.out.println(tipo);//se for Inteiro o tipo é true, se String tipo é false

    }
M

Justamente o que DavidUser disse. O tratamento de erros e ações inesperadas que ocorrem em um programa Java são chamadas exceções. Veja outro exemplo:

import java.util.Scanner;

public class Tipos {

	public static void main(String[] args) {
		Scanner entrada = new Scanner(System.in);
		System.out.print("Digite uma String qualquer: ");
		String valor = entrada.next();
		System.out.println("String digitada: " + valor);
		try {
			Integer.parseInt(valor);
			System.out.println("A string digitada é um inteiro válido.");
		} catch (NumberFormatException e) {
			System.out.println("String não reconhecida como inteiro.");
		}
	}

}

No exemplo, uma exceção é lançada pelo método Integer.parseInt() caso a String não represente um inteiro válido (e consequentemente a frase de erro é apresentada). Se exceção alguma ocorrer, é mostrada a mensagem de sucesso.

E quanto ao caso de nomes e valores que seguem padrões, existe uma coisa em Java chamada regex (Regular Expressions ou Expressões Regulares) que serve para isso. Mas acho que esse assunto já começa a se tornar um pouco complexo. De qualquer forma, ficam aqui alguns links caso você se interesse:

Exceções
Regex

Procure sobre o assunto na seção de artigos do GUJ, pois deve ter algo interessante lá também.

DavidUser

como funciona o regex?
tem como dar um exemplo básico?

M

Um programa de linha de comando que exige que o usuário digite um código com uma letra maiúscula seguida de três números:

import java.util.Scanner;
import java.util.regex.Pattern;

public class UsandoRegex {

	public static void main(String[] args) {
		Scanner entrada = new Scanner(System.in);
		System.out.print("Digite uma letra maiúscula seguida"
				+ " de três números: ");
		String resultado = entrada.nextLine();
		// o Pattern é uma letra de A até Z e 3 dígitos
		while (!Pattern.matches("[A-Z]\d{3}", resultado)) {
			System.out.print("Entrada inválida. Tente novamente: ");
			resultado = entrada.nextLine();
		}
		System.out.println("Valor digitado: " + resultado);
	}
}

Esse é um exemplo bem simples, porém funcional. Mas regex é muito mais poderoso do que parece.

tiagoenes

:smiley: Muito bom cara, parabéns!100000000000000000

Criado 18 de abril de 2009
Ultima resposta 22 de abr. de 2009
Respostas 31
Participantes 4