Pessoal, eu preciso desenvolver um projeto, que gere uma fatura de conta telefônica. O enunciado do projeto, é esse:
[quote]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.
[/quote]
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:
[quote]java.lang.NullPointerException
at fatura.<init>(Main.java:313)
at Main.main(Main.java:459)
Exception in thread “main” [/quote]
[code]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();
}
}[/code]