Problemas com esse programa

4 respostas
R

Pessoal, eu preciso desenvolver um projeto, que gere uma fatura de conta telefônica. O enunciado do projeto, é esse:

Faça um programa para calcular o valor da conta telefônica da empresa em que você trabalha. A conta é composta por ligações locais e ligações interurbanas.

Para a ligação local são registrados o dia da semana e o horário em que foi iniciada a ligação, bem como o dia da semana e o horário em que foi finalizada. O preço cobrado por uma ligação local depende da quantidade de pulsos que, neste caso, é tomada como a quantidade de minutos gasta com a ligação, exceto quando o dia da semana for domingo ou sábado após as 14:00 horas, quando então só é contabilizado um pulso independente do tempo de ligação. O preço de uma ligação local é computado em função do produto entre a quantidade de pulsos e o valor cobrado pelo pulso.

Já para uma ligação interurbana é registrado o número do telefone de destino (para ser impresso na fatura), o dia da semana e horário em que a ligação foi iniciada, e o dia da semana e o horário em que foi encerrada. O preço de uma ligação interurbana é calculado em função da quantidade de minutos que consumiu e pelo preço cobrado por minuto.

O plano de telefonia que a empresa que você trabalha contratou segue as seguintes regras:
 De segunda à sexta, em horário comercial (08:00h às 11:59h e 13:00h às 17:59h), o preço cobrado por minuto é acrescido de 10%;
 De segunda à sexta no horário das 21:00 as 23:59, o preço do minuto é reduzido em 25%
 Aos sábados após as 14:00 horas, o preço do minuto é reduzido em 25%.
 Aos domingos das 06:00 as 23:59, o preço é reduzido em 25%.
 Em qualquer dia da semana, das 00:00 h até as 5:59h, o preço do minuto é reduzido em 50%.

O seu programa deve conter classes para manipular informações a respeito de cada tipo de ligação. Além dessas, deve ser implementada uma classe Fatura, que deve conter as informações sobre as ligações efetuadas, onde deve ser implementado:
 Um método para cadastrar as ligações.
 Um método que imprima na tela a fatura a ser paga pela companhia

Observação

Nas classes referentes às ligações deve se ter o cuidado de contabilizar corretamente o preço das ligações que iniciam em um determinado horário e que perduram, passando a ter diferentes valores de pulso (ligações locais), ou diferentes valores de minuto (ligações interurbanas).

Exemplo: ligação local iniciada no sábado as 13:00 e encerrada as 14:30, deve ser contabilizado como 61 pulsos, e não 90.

Para os cálculos de valor da fatura, você deve criar duas constantes que fornecem o preço em reais do pulso das ligações locais e do minuto das ligações interurbanas.

Eu já desenvolvi todas as classes necessário e mais uma classe para fazer os testes com as classes do programa em si, porém está ocorrendo um erro que eu não sei porque ocorre.

Vou postar todo o código para vocês analisarem. Só adiantando, o erro que aparece, é esse aqui:

java.lang.NullPointerException
at fatura.<init>(Main.java:313)
at Main.main(Main.java:459)
Exception in thread "main"

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;

class ligacao
{
	byte hora_i, hora_f, minuto_i, minuto_f;
	byte dia_i, dia_f;
	
	String telefone;
	String dia_final,dia_inicial,hora_inicial,hora_final;
	double valor;
	boolean ocupado = false;
	
	public int tempo_total()
	{
		int m_i,m_f;
		int operando,tempo_dia,total=0;
		
		tempo_dia = this.dia_f - this.dia_i;
		tempo_dia = tempo_dia*24;
		tempo_dia = tempo_dia*60;
		
		m_i = this.hora_i*60;
		m_i = m_i+this.minuto_i;
		
		m_f = this.hora_f*60;
		m_f= m_f + this.minuto_f;
		
		
		if (m_f > m_i)
		{
			operando = m_f-m_i;
			total = tempo_dia+operando;
		}	
		if (m_f < m_i)
		{
			operando = m_i-m_f;
			total = tempo_dia-operando;
		}
		if (m_f == m_i)
		{
			total = tempo_dia;
		}
		return total;
	}
}

class ligacao_local extends ligacao
{
	private double preco_local = 0.05;	//Preco por pulso.
	private int pulso = 3; 				//1 pulso equivale a 3 minutos.
	private int pulsos;					//Armezena o total de pulsos da ligação..
	private int tempo_total;
	
	public ligacao_local(byte hora_inicial,byte minuto_inicial,byte hora_final, byte minuto_final, byte dia_inicial, byte dia_final)
	{
		
		this.dia_f = dia_final;
		this.dia_i = dia_inicial;
		this.hora_f = hora_final;
		this.hora_i = hora_inicial;
		this.minuto_f = minuto_final;
		this.minuto_i = minuto_inicial;
		
		this.tempo_total = this.tempo_total();
	}
	
	public double preco_local()
	{
		double valor;
		
		this.pulsos = this.tempo_total / this.pulso;
		
		switch (this.dia_i)
		{
			case 1: //Segunda-feira
			{
				valor = this.pulsos*this.preco_local;
				return valor;
			}
			case 2: //Terça-feira
			{
				valor = pulsos*this.preco_local;
				return valor;
			}
			case 3: //Quarta-feira
			{
				valor = pulsos*this.preco_local;
				return valor;
			}
			case 4: //Quinta-feira
			{
				valor = pulsos*this.preco_local;
				return valor;
			}
			case 5: //Sexta-feira
			{
				valor = pulsos*this.preco_local;
				return valor;
			}
			case 6: //Sábado
			{
				if (this.hora_i >= 14)
				{
					return this.preco_local;
				}
				else
				{
					valor = pulsos*this.preco_local;
					return valor;
				}
			}
			case 7: //Domingo
			{
				return this.preco_local;
			}				
		}
		return -1;
	}
}

class ligacao_inter extends ligacao
{
	private int tempo_total; 			//Tempo total de uma ligação interurbana
	private double preco_minuto = 0.45;	//Na ligacao interurbana, é cobrado um valor por minuto.
	private int total_ligacoes; 		//Contabiliza o total de ligações feitas.
	
	public ligacao_inter(byte hora_inicial,byte minuto_inicial,byte hora_final, byte minuto_final, byte dia_inicial, byte dia_final)
	{
		this.dia_f = dia_final;
		this.dia_i = dia_inicial;
		this.hora_f = hora_final;
		this.hora_i = hora_inicial;
		this.minuto_f = minuto_final;
		this.minuto_i = minuto_inicial;
		
		this.tempo_total = this.tempo_total();
	}
	
	public double preco()
	{
		double valor;
		
		switch (this.dia_i)
		{
			case 1: //Segunda-feira
			{
				if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
				{
					valor = (this.tempo_total*this.preco_minuto)*1.1;
					return valor;
				}
				if ((this.hora_i >= 21) && (this.hora_i < 24))
				{
					valor = (this.tempo_total*this.preco_minuto)*0.75;
					return valor;
				}
				if (this.hora_i == 12)
				{
					valor = (this.tempo_total*this.preco_minuto);
					return valor;
				}
				else
				{
					valor = (this.tempo_total*this.preco_minuto)*0.5;
					return valor;
				}
			}
			case 2: //Terça-feira
			{
				if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
				{
					valor = (this.tempo_total*this.preco_minuto)*1.1;
					return valor;
				}
				if ((this.hora_i >= 21) && (this.hora_i < 24))
				{
					valor = (this.tempo_total*this.preco_minuto)*0.75;
					return valor;
				}
				if (this.hora_i == 12)
				{
					valor = (this.tempo_total*this.preco_minuto);
					return valor;
				}
				else
				{
					valor = (this.tempo_total*this.preco_minuto)*0.5;
					return valor;
				}
			}
			case 3: //Quarta-feira
			{
				if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
				{
					valor = (this.tempo_total*this.preco_minuto)*1.1;
					return valor;
				}
				if ((this.hora_i >= 21) && (this.hora_i < 24))
				{
					valor = (this.tempo_total*this.preco_minuto)*0.75;
					return valor;
				}
				if (this.hora_i == 12)
				{
					valor = (this.tempo_total*this.preco_minuto);
					return valor;
				}
				else
				{
					valor = (this.tempo_total*this.preco_minuto)*0.5;
					return valor;
				}
			}
			case 4: //Quinta-feira
			{
				if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
				{
					valor = (this.tempo_total*this.preco_minuto)*1.1;
					return valor;
				}
				if ((this.hora_i >= 21) && (this.hora_i < 24))
				{
					valor = (this.tempo_total*this.preco_minuto)*0.75;
					return valor;
				}
				if (this.hora_i == 12)
				{
					valor = (this.tempo_total*this.preco_minuto);
					return valor;
				}
				else
				{
					valor = (this.tempo_total*this.preco_minuto)*0.5;
					return valor;
				}
			}
			case 5: //Sexta-feira
			{
				if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
				{
					valor = (this.tempo_total*this.preco_minuto)*1.1;
					return valor;
				}
				if ((this.hora_i >= 21) && (this.hora_i < 24))
				{
					valor = (this.tempo_total*this.preco_minuto)*0.75;
					return valor;
				}
				if (this.hora_i == 12)
				{
					valor = (this.tempo_total*this.preco_minuto)*0.5;
					return valor;
				}
				else
				{
					valor = (this.tempo_total*this.preco_minuto)*0.5;
					return valor;
				}
			}
			case 6: //Sabado
			{
				if (this.hora_i >= 14)
				{
					valor = (this.tempo_total*this.preco_minuto)*0.75;
					return valor;
				}
				if ((this.hora_i >= 0) && (this.hora_i < 6))
				{
					valor = (this.tempo_total*this.preco_minuto)*0.5;
					return valor;
				}
				else
				{
					valor = (this.tempo_total*this.preco_minuto);
					return valor;
				}
			}
			case 7: //Domingo
			{
				if ((this.hora_i >= 6) && (this.hora_i < 24))
				{
					valor = (this.tempo_total*this.preco_minuto)*0.75;
					return valor;
				}
				else
				{
					valor = (this.tempo_total*this.preco_minuto)*0.5;
					return valor;
				}
			}
			default:
			{
				return -1;
			}
		}
	}
}	

class fatura
{
	int qts_ligacoes = 500;
	ligacao ligacoes[];
		
	public fatura()
	{
		this.ligacoes = new ligacao[qts_ligacoes];
		int i;
		
		for (i=0;i<qts_ligacoes;i++)
		{
			this.ligacoes[i].ocupado = false;
		}
	}
	
	public void liga_local(byte hora_inicial,byte minuto_inicial,byte hora_final, byte minuto_final, byte dia_inicial, byte dia_final)
	{
		double preco;
		String hora_i, hora_f, dia_f, dia_i,tel;
		
		int posicao = this.OndeGuardar();
		
		ligacao_local x = new ligacao_local(hora_inicial,minuto_inicial,hora_final,minuto_final,dia_inicial,dia_final);
		
		preco = x.preco_local();
		hora_i = this.toStringH(hora_inicial,minuto_inicial);
		hora_f = this.toStringH(hora_final,minuto_final);
		dia_i = this.ObtemDia(dia_inicial);
		dia_f = this.ObtemDia(dia_final);
		tel = "LIGAÇÃO LOCAL";
		
		this.ligacoes[posicao].dia_final = dia_f;
		this.ligacoes[posicao].dia_inicial = dia_i;
		this.ligacoes[posicao].hora_inicial = hora_i;
		this.ligacoes[posicao].hora_final = hora_f;
		this.ligacoes[posicao].telefone = tel;
		this.ligacoes[posicao].valor = preco;
		this.ligacoes[posicao].ocupado = true;
		
	}
	
	public void liga_inter(byte hora_inicial,byte minuto_inicial,byte hora_final, byte minuto_final, byte dia_inicial, byte dia_final, String tel)
	{
		double preco;
		String hora_i, hora_f, dia_f, dia_i;
		
		int posicao = this.OndeGuardar();
		
		ligacao_inter x = new ligacao_inter(hora_inicial,minuto_inicial,hora_final,minuto_final,dia_inicial,dia_final);
		
		preco = x.preco();
		hora_i = this.toStringH(hora_inicial,minuto_inicial);
		hora_f = this.toStringH(hora_final,minuto_final);
		dia_i = this.ObtemDia(dia_inicial);
		dia_f = this.ObtemDia(dia_final);
		
		this.ligacoes[posicao].telefone = tel;
		this.ligacoes[posicao].dia_final = dia_f;
		this.ligacoes[posicao].dia_inicial = dia_i;
		this.ligacoes[posicao].hora_final = hora_f;
		this.ligacoes[posicao].hora_inicial = hora_i;
		this.ligacoes[posicao].ocupado = true;
		this.ligacoes[posicao].valor = preco;
		this.ligacoes[posicao].ocupado = true;
		
	}
	
		public String ObtemDia(int dia)
		{
			switch (dia)
			{
				case 1: //Segunda-feira
				{
					return "Segunda-feira";
				}
				case 2: //Terça-feira
				{
					return "Terça-feira";
				}
				case 3: //Quarta-feira
				{
					return "Quarta-feira";
				}
				case 4: //Quinta-feira
				{
					return "Quinta-feira";
				}
				case 5: //Sexta-feira
				{
					return "Sexta-feira";
				}
				case 6: //Sábado
				{
					return "Sábado";
				}
				case 7: //Domingo
				{
					return "Domingo";
				}
				default:
				{
					return "ERRO";
				}
			}
		}
	
		public String toStringH(int hora, int minuto)
		{
			String s;
			s = new String(hora+":"+minuto);
			return s;
		}
	
		private int OndeGuardar()
		{
			int i=0;

			while (this.ligacoes[i].ocupado == true)
			{
				i++;
			}
			return i;
		}
	
		public void exibe_conta()
		{
			int i = 0;
			double total=0;
		
			System.out.println("         FATURA        ");
			System.out.println("-----------------------");
		
			System.out.println("  HORÁRIOS    -     DIAS DA SEMANA       -   TELEFONE   -   VALOR");
		
			while (this.ligacoes[i].ocupado == true)
			{
				System.out.print(this.ligacoes[i].hora_inicial + " - ");
				System.out.print(this.ligacoes[i].hora_final + " - ");
				System.out.print(this.ligacoes[i].dia_inicial + " - ");
				System.out.print(this.ligacoes[i].dia_final + " - ");
				System.out.print(this.ligacoes[i].telefone + " - ");
				System.out.println("R$"+this.ligacoes[i].valor);
				total=total+this.ligacoes[i].valor;
				i++;
			}
			System.out.print("Total a ser pago: ");
			System.out.println("R$"+total);
		}
	}

	public class Main 
	{
		public static void main(String Args[]) throws IOException
		{
			char opc;
			String s;
		
			fatura conta = new fatura();
		
			BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
		
			System.out.println("PROJETO DE JAVA");
			System.out.println("----------------");
			System.out.println();
			System.out.println("Autor: Ricardo Augusto Giaviti 04076865");
			System.out.println("Autor: Marcos Akira Sekiya 04076865");
			System.out.println();
			System.out.println("CONTA TELEFÔNICA");
			System.out.println("----------------");
		
			do
			{
				System.out.println("Qual sua opção?");
				System.out.println("1 - Ligação local");
				System.out.println("2 - Ligação interurbana");
				System.out.println("3 - Exibir fatura");
				System.out.println("S - Sair");
			
				s = entrada.readLine();
				opc = s.charAt(0);
			
				switch (opc)
				{
					case '1':
					{
						Main.local(conta);
						break;
					}
					case '2':
					{
						Main.inter(conta);
						break;
					}
					case '3':
					{
						Main.fatura(conta);
						break;
					}
				}
			}
			while ((opc != 's') || (opc != 'S'));
		
		}
	
		public static void local(fatura conta) throws IOException
		{
			BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
		
			String s;
			byte horas_i,horas_f,minutos_i,minutos_f,dia,dia_f;
			boolean erro;
		
			System.out.println("LIGAÇÃO LOCAL");
			System.out.println("-------------");
		
			System.out.print("Hora de início: ");
			s = entrada.readLine();
		
			horas_i = Byte.parseByte(s); //Conversão para INT
		
			System.out.print("Minuto de início: ");
			s = entrada.readLine();
		
			minutos_i = Byte.parseByte(s);
		
			System.out.print("Hora final: ");
			s = entrada.readLine();
		
			horas_f = Byte.parseByte(s); //Conversão para INT
			System.out.print("Minuto final: ");
			s = entrada.readLine();
		
			minutos_f = Byte.parseByte(s);
		
			System.out.println("Escolha o dia");
			System.out.println("1 - Segunda-feira");
			System.out.println("2 - Terça-feira");
			System.out.println("3 - Quarta-feira");
			System.out.println("4 - Quinta-feira");
			System.out.println("5 - Sexta-feira");
			System.out.println("6 - Sábado");
			System.out.println("7 - Domingo");
		
			System.out.print("DIA: ");
			s = entrada.readLine();
		
			dia = Byte.parseByte(s);
		
			System.out.println("Escolha o dia de término da ligação");
			System.out.println("1 - Segunda-feira");
			System.out.println("2 - Terça-feira");
			System.out.println("3 - Quarta-feira");
			System.out.println("4 - Quinta-feira");
			System.out.println("5 - Sexta-feira");
			System.out.println("6 - Sábado");
			System.out.println("7 - Domingo");
		
			System.out.print("DIA: ");
			s = entrada.readLine();
		
			dia_f = Byte.parseByte(s);
		
			conta.liga_local(horas_i,minutos_i,horas_f,minutos_f,dia,dia_f);
		
			System.out.println("Cadastrado com sucesso.");
			
		}
	
		public static void inter(fatura conta) throws IOException
		{
			BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
		
			boolean erro;
			String s,tel;
			byte horas_i,horas_f,minutos_i,minutos_f,dia,dia_f;
		
			System.out.println("LIGAÇÃO INTERURBANA");
			System.out.println("-------------");
		
			System.out.print("Telefone de destino: ");
			tel = entrada.readLine();
		
			System.out.print("Hora de início: ");
			s = entrada.readLine();
		
			horas_i = Byte.parseByte(s); //Conversão para INT
		
			System.out.print("Minuto de início: ");
			s = entrada.readLine();
		
			minutos_i = Byte.parseByte(s);
		
			System.out.print("Hora final: ");
			s = entrada.readLine();
		
			horas_f = Byte.parseByte(s); //Conversão para INT
			System.out.print("Minuto final: ");
			s = entrada.readLine();
		
			minutos_f = Byte.parseByte(s);
		
			System.out.println("Escolha o dia de início da ligação");
			System.out.println("1 - Segunda-feira");
			System.out.println("2 - Terça-feira");
			System.out.println("3 - Quarta-feira");
			System.out.println("4 - Quinta-feira");
			System.out.println("5 - Sexta-feira");
			System.out.println("6 - Sábado");
			System.out.println("7 - Domingo");
		
			System.out.print("DIA: ");
			s = entrada.readLine();
		
			dia = Byte.parseByte(s);
		
			System.out.println("Escolha o dia de término da ligação");
			System.out.println("1 - Segunda-feira");
			System.out.println("2 - Terça-feira");
			System.out.println("3 - Quarta-feira");
			System.out.println("4 - Quinta-feira");
			System.out.println("5 - Sexta-feira");
			System.out.println("6 - Sábado");
			System.out.println("7 - Domingo");
		
			System.out.print("DIA: ");
			s = entrada.readLine();
		
			dia_f = Byte.parseByte(s);
		
			conta.liga_inter(horas_i,minutos_i,horas_f,minutos_f,dia,dia_f,tel);
		
				System.out.println("Cadastrado com sucesso.");
			
		}
	
		public static void fatura(fatura conta)
		{
			conta.exibe_conta();
		}
	}

4 Respostas

G

Kra, destaca a linha 313 do main por favor.

Fica complicado de achar no meio de tanta coisa,hehe.

Eh lah q está o erro e eu estava com um desse mesmo agora pouco, talvez eu consiga te ajudar

R
class fatura
{
	int qts_ligacoes = 500;
	ligacao ligacoes[];
		
	public fatura()
	{
		this.ligacoes = new ligacao[qts_ligacoes];
		int i;
		
		for (i=0;i<qts_ligacoes;i++)
		{
			this.ligacoes[i].ocupado = false; <--LINHA 313
		}
	}
...

Ta destacado, esse construtor, é para atribuir false em todas as posições do vetor ligacoes.

J

cara, voce nao precisa usar esse loop…diferentemente de c/c++ java ja coloca um valor default para variaveis nao inicializadas:

o erro talvez seja porque nessa classe ligacao o atributo ocupado deve ser private ou protected…tente usar o modificador public, ou usar um metodo set.

ps.: noa vi se tem a classe ligacao no codigo que voce mandou ,mas da uma olhada nisso.

flw

P

Olá ,

cara seu erro eh o seguinte: na classe “ligacao” vc deve colocar como publico e statico a variavel boolean ocupado

>> public static boolean ocupado = false; <<

ok

tenta ae que vai rodar show…

farô

Criado 13 de junho de 2005
Ultima resposta 14 de jun. de 2005
Respostas 4
Participantes 4