Update Troubleshooting.md #1558
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
import java.util.Scanner;
// ======================
// 1. CLASSES BÁSICAS
// ======================
/**
Classe Data: representa uma data, com validação de ano bissexto e métodos para comparar datas.
*/
class Data {
private int dia, mes, ano;
public Data(int dia, int mes, int ano) {
if (!validarData(dia, mes, ano)) {
System.out.println("Data inválida! Configurando para 01/01/2000");
this.dia = 1;
this.mes = 1;
this.ano = 2000;
} else {
this.dia = dia;
this.mes = mes;
this.ano = ano;
}
}
private boolean validarData(int dia, int mes, int ano) {
if (mes < 1 || mes > 12) return false;
int maxDias;
switch (mes) {
case 2:
maxDias = verificaAnoBissexto(ano) ? 29 : 28;
break;
case 4: case 6: case 9: case 11:
maxDias = 30;
break;
default:
maxDias = 31;
}
return dia >= 1 && dia <= maxDias;
}
public boolean verificaAnoBissexto() {
return (ano % 400 == 0) || (ano % 4 == 0 && ano % 100 != 0);
}
// Método de comparação: retorna <0 se this < outra, 0 se igual, >0 se this > outra
public int comparar(Data outra) {
if (this.ano != outra.ano) return this.ano - outra.ano;
if (this.mes != outra.mes) return this.mes - outra.mes;
return this.dia - outra.dia;
}
// Getters e Setters
public int getDia() { return dia; }
public void setDia(int dia) { this.dia = dia; }
public int getMes() { return mes; }
public void setMes(int mes) { this.mes = mes; }
public int getAno() { return ano; }
public void setAno(int ano) { this.ano = ano; }
@OverRide
public String toString() {
return String.format("%02d/%02d/%04d", dia, mes, ano);
}
}
/**
Classe Endereco: representa o endereço de uma loja ou shopping.
*/
class Endereco {
private String nomeDaRua, cidade, estado, pais, cep, numero, complemento;
public Endereco(String nomeDaRua, String cidade, String estado, String pais, String cep, String numero, String complemento) {
this.nomeDaRua = nomeDaRua;
this.cidade = cidade;
this.estado = estado;
this.pais = pais;
this.cep = cep;
this.numero = numero;
this.complemento = complemento;
}
// Getters e Setters
public String getNomeDaRua() { return nomeDaRua; }
public void setNomeDaRua(String nomeDaRua) { this.nomeDaRua = nomeDaRua; }
public String getCidade() { return cidade; }
public void setCidade(String cidade) { this.cidade = cidade; }
public String getEstado() { return estado; }
public void setEstado(String estado) { this.estado = estado; }
public String getPais() { return pais; }
public void setPais(String pais) { this.pais = pais; }
public String getCep() { return cep; }
public void setCep(String cep) { this.cep = cep; }
public String getNumero() { return numero; }
public void setNumero(String numero) { this.numero = numero; }
public String getComplemento() { return complemento; }
public void setComplemento(String complemento) { this.complemento = complemento; }
@OverRide
public String toString() {
return String.format("%s, %s%s\n%s/%s\n%s\nCEP: %s",
nomeDaRua, numero, (complemento == null || complemento.isEmpty() ? "" : " - " + complemento),
cidade, estado, pais, cep);
}
}
/**
Classe Produto: representa um produto, com nome, preço e data de validade.
*/
class Produto {
private String nome;
private double preco;
private Data dataValidade;
// Construtor com data de validade
public Produto(String nome, double preco, Data dataValidade) {
this.nome = nome;
this.preco = preco;
this.dataValidade = dataValidade;
}
// Construtor sem data de validade (usado em etapas anteriores)
public Produto(String nome, double preco) {
this(nome, preco, null);
}
// Verifica se o produto está vencido, comparando a data de validade com a data informada
public boolean estaVencido(Data data) {
if (dataValidade == null) return false;
return dataValidade.comparar(data) < 0;
}
// Getters e Setters
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public double getPreco() { return preco; }
public void setPreco(double preco) { this.preco = preco; }
public Data getDataValidade() { return dataValidade; }
public void setDataValidade(Data dataValidade) { this.dataValidade = dataValidade; }
@OverRide
public String toString() {
if (dataValidade != null)
return String.format("%s - R$%.2f (Val: %s)", nome, preco, dataValidade);
else
return String.format("%s - R$%.2f", nome, preco);
}
}
// ======================
// 2. CLASSE LOJA (Pai)
// ======================
/**
Classe Loja: representa uma loja genérica, com estoque de produtos.
*/
class Loja {
private String nome;
private int quantidadeFuncionarios;
private double salarioBaseFuncionario;
private Endereco endereco;
private Data dataFundacao;
private Produto[] estoqueProdutos;
// Construtor mais completo (usado na última etapa)
public Loja(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario, Endereco endereco, Data dataFundacao, int capacidadeEstoque) {
this.nome = nome;
this.quantidadeFuncionarios = quantidadeFuncionarios;
this.salarioBaseFuncionario = salarioBaseFuncionario;
this.endereco = endereco;
this.dataFundacao = dataFundacao;
this.estoqueProdutos = new Produto[capacidadeEstoque];
}
// Construtor sem salário base (usado em algumas etapas)
public Loja(String nome, int quantidadeFuncionarios, Endereco endereco, Data dataFundacao, int capacidadeEstoque) {
this(nome, quantidadeFuncionarios, -1, endereco, dataFundacao, capacidadeEstoque);
}
// Construtor sem estoque (etapas iniciais)
public Loja(String nome, int quantidadeFuncionarios) {
this(nome, quantidadeFuncionarios, -1, null, null, 0);
}
public Loja(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario) {
this(nome, quantidadeFuncionarios, salarioBaseFuncionario, null, null, 0);
}
public Loja(String nome, int quantidadeFuncionarios, Endereco endereco, Data dataFundacao) {
this(nome, quantidadeFuncionarios, -1, endereco, dataFundacao, 0);
}
public Loja(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario, Endereco endereco, Data dataFundacao) {
this(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, 0);
}
// Métodos de negócio
public double gastosComSalario() {
if (salarioBaseFuncionario == -1) return -1;
return quantidadeFuncionarios * salarioBaseFuncionario;
}
public char tamanhoDaLoja() {
if (quantidadeFuncionarios < 10) return 'P';
if (quantidadeFuncionarios <= 30) return 'M';
return 'G';
}
// Métodos de estoque
public boolean insereProduto(Produto produto) {
if (estoqueProdutos == null) return false;
for (int i = 0; i < estoqueProdutos.length; i++) {
if (estoqueProdutos[i] == null) {
estoqueProdutos[i] = produto;
return true;
}
}
return false;
}
public boolean removeProduto(String nomeProduto) {
if (estoqueProdutos == null) return false;
for (int i = 0; i < estoqueProdutos.length; i++) {
if (estoqueProdutos[i] != null && estoqueProdutos[i].getNome().equalsIgnoreCase(nomeProduto)) {
estoqueProdutos[i] = null;
return true;
}
}
return false;
}
public void imprimeProdutos() {
if (estoqueProdutos == null) return;
for (Produto p : estoqueProdutos) {
if (p != null) System.out.println(p);
}
}
// Getters e Setters
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public int getQuantidadeFuncionarios() { return quantidadeFuncionarios; }
public void setQuantidadeFuncionarios(int quantidadeFuncionarios) { this.quantidadeFuncionarios = quantidadeFuncionarios; }
public double getSalarioBaseFuncionario() { return salarioBaseFuncionario; }
public void setSalarioBaseFuncionario(double salarioBaseFuncionario) { this.salarioBaseFuncionario = salarioBaseFuncionario; }
public Endereco getEndereco() { return endereco; }
public void setEndereco(Endereco endereco) { this.endereco = endereco; }
public Data getDataFundacao() { return dataFundacao; }
public void setDataFundacao(Data dataFundacao) { this.dataFundacao = dataFundacao; }
public Produto[] getEstoqueProdutos() { return estoqueProdutos; }
public void setEstoqueProdutos(Produto[] estoqueProdutos) { this.estoqueProdutos = estoqueProdutos; }
@OverRide
public String toString() {
return String.format("%s\n%s\nFuncionários: %d | Tamanho: %c\nFundada em: %s",
nome, endereco, quantidadeFuncionarios, tamanhoDaLoja(), dataFundacao);
}
}
// ===================================
// 3. CLASSES ESPECIALIZADAS DE LOJA
// ===================================
/**
Classe Cosmetico: loja especializada, com taxa de comercialização.
*/
class Cosmetico extends Loja {
private double taxaComercializacao;
// Construtor para etapas intermediárias
public Cosmetico(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, int capacidadeEstoque) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, capacidadeEstoque);
}
// Construtor para etapa final
public Cosmetico(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, int capacidadeEstoque, double taxaComercializacao) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, capacidadeEstoque);
this.taxaComercializacao = taxaComercializacao;
}
// Getters e Setters
public double getTaxaComercializacao() { return taxaComercializacao; }
public void setTaxaComercializacao(double taxaComercializacao) { this.taxaComercializacao = taxaComercializacao; }
@OverRide
public String toString() {
return super.toString() + String.format("\nTaxa: %.2f%%", taxaComercializacao);
}
}
/**
Classe Vestuario: loja especializada, informa se vende produtos importados.
*/
class Vestuario extends Loja {
private boolean produtosImportados;
// Construtor para etapas intermediárias
public Vestuario(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, boolean produtosImportados) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, 0);
this.produtosImportados = produtosImportados;
}
// Construtor para etapa final
public Vestuario(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, boolean produtosImportados, int capacidadeEstoque) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, capacidadeEstoque);
this.produtosImportados = produtosImportados;
}
// Getters e Setters (obs: getProdutosImportados, não isProdutosImportados)
public boolean getProdutosImportados() { return produtosImportados; }
public void setProdutosImportados(boolean produtosImportados) { this.produtosImportados = produtosImportados; }
@OverRide
public String toString() {
return super.toString() + "\nProdutos Importados: " + (produtosImportados ? "Sim" : "Não");
}
}
/**
Classe Bijuteria: loja especializada, com meta de vendas.
*/
class Bijuteria extends Loja {
private double metaVendas;
// Construtor para etapas intermediárias
public Bijuteria(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, double metaVendas) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, 0);
this.metaVendas = metaVendas;
}
// Construtor para etapa final
public Bijuteria(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, double metaVendas, int capacidadeEstoque) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, capacidadeEstoque);
this.metaVendas = metaVendas;
}
// Getters e Setters
public double getMetaVendas() { return metaVendas; }
public void setMetaVendas(double metaVendas) { this.metaVendas = metaVendas; }
@OverRide
public String toString() {
return super.toString() + String.format("\nMeta de Vendas Mensais: R$%.2f", metaVendas);
}
}
/**
Classe Alimentacao: loja especializada, exige data do alvará.
*/
class Alimentacao extends Loja {
private Data dataAlvara;
// Construtor para etapas intermediárias
public Alimentacao(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, Data dataAlvara) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, 0);
this.dataAlvara = dataAlvara;
}
// Construtor para etapa final
public Alimentacao(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, Data dataAlvara, int capacidadeEstoque) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, capacidadeEstoque);
this.dataAlvara = dataAlvara;
}
// Getters e Setters
public Data getDataAlvara() { return dataAlvara; }
public void setDataAlvara(Data dataAlvara) { this.dataAlvara = dataAlvara; }
@OverRide
public String toString() {
return super.toString() + "\nData do Alvará: " + dataAlvara;
}
}
/**
Classe Informatica: loja especializada, com seguro para eletrônicos.
*/
class Informatica extends Loja {
private double seguroEletronicos;
// Construtor para etapas intermediárias
public Informatica(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, double seguroEletronicos) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, 0);
this.seguroEletronicos = seguroEletronicos;
}
// Construtor para etapa final
public Informatica(String nome, int quantidadeFuncionarios, double salarioBaseFuncionario,
Endereco endereco, Data dataFundacao, double seguroEletronicos, int capacidadeEstoque) {
super(nome, quantidadeFuncionarios, salarioBaseFuncionario, endereco, dataFundacao, capacidadeEstoque);
this.seguroEletronicos = seguroEletronicos;
}
// Getters e Setters
public double getSeguroEletronicos() { return seguroEletronicos; }
public void setSeguroEletronicos(double seguroEletronicos) { this.seguroEletronicos = seguroEletronicos; }
@OverRide
public String toString() {
return super.toString() + String.format("\nSeguro de Eletrônicos: R$%.2f", seguroEletronicos);
}
}
// ======================
// 4. CLASSE SHOPPING
// ======================
/**
Classe Shopping: representa um shopping, que gerencia um array de lojas.
*/
class Shopping {
private String nome;
private Endereco endereco;
private Loja[] lojas;
public Shopping(String nome, Endereco endereco, int capacidade) {
this.nome = nome;
this.endereco = endereco;
this.lojas = new Loja[capacidade];
}
public boolean insereLoja(Loja loja) {
for (int i = 0; i < lojas.length; i++) {
if (lojas[i] == null) {
lojas[i] = loja;
return true;
}
}
return false;
}
public boolean removeLoja(String nomeLoja) {
for (int i = 0; i < lojas.length; i++) {
if (lojas[i] != null && lojas[i].getNome().equalsIgnoreCase(nomeLoja)) {
lojas[i] = null;
return true;
}
}
return false;
}
public int quantidadeLojasPorTipo(String tipo) {
int contador = 0;
String tipoLower = tipo.toLowerCase();
for (Loja loja : lojas) {
if (loja != null) {
switch (tipoLower) {
case "cosmetico":
case "cosmético":
if (loja instanceof Cosmetico) contador++;
break;
case "vestuario":
case "vestuário":
if (loja instanceof Vestuario) contador++;
break;
case "bijuteria":
if (loja instanceof Bijuteria) contador++;
break;
case "alimentacao":
case "alimentação":
if (loja instanceof Alimentacao) contador++;
break;
case "informatica":
case "informática":
if (loja instanceof Informatica) contador++;
break;
default:
return -1;
}
}
}
return contador;
}
public Informatica lojaSeguroMaisCaro() {
Informatica maisCara = null;
double maiorSeguro = -1;
for (Loja loja : lojas) {
if (loja instanceof Informatica) {
Informatica atual = (Informatica) loja;
if (atual.getSeguroEletronicos() > maiorSeguro) {
maiorSeguro = atual.getSeguroEletronicos();
maisCara = atual;
}
}
}
return maisCara;
}
// Getters e Setters
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public Endereco getEndereco() { return endereco; }
public void setEndereco(Endereco endereco) { this.endereco = endereco; }
public Loja[] getLojas() { return lojas; }
public void setLojas(Loja[] lojas) { this.lojas = lojas; }
@OverRide
public String toString() {
return String.format("Shopping %s\n%s\nCapacidade: %d lojas", nome, endereco, lojas.length);
}
}
// ======================
// 5. CLASSE PRINCIPAL
// ======================
/**
Classe Principal: menu interativo para teste do sistema.
*/
public class Principal {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Loja loja = null;
Produto produto = null;
}
// Método auxiliar para criar uma loja usando Scanner e menu
private static Loja criarLoja(Scanner input) {
System.out.println("\n--- Cadastro de Loja ---");
System.out.print("Nome da loja: ");
String nome = input.nextLine();
System.out.print("Quantidade de funcionários: ");
int qtdFunc = input.nextInt();
input.nextLine();
System.out.print("Salário base (-1 se não souber): ");
double salarioBase = input.nextDouble();
input.nextLine();
System.out.println("\nEndereço da loja:");
System.out.print("Nome da rua: ");
String rua = input.nextLine();
System.out.print("Cidade: ");
String cidade = input.nextLine();
System.out.print("Estado: ");
String estado = input.nextLine();
System.out.print("País: ");
String pais = input.nextLine();
System.out.print("CEP: ");
String cep = input.nextLine();
System.out.print("Número: ");
String numero = input.nextLine();
System.out.print("Complemento: ");
String complemento = input.nextLine();
Endereco endereco = new Endereco(rua, cidade, estado, pais, cep, numero, complemento);
System.out.println("\nData de fundação:");
System.out.print("Dia: ");
int dia = input.nextInt();
System.out.print("Mês: ");
int mes = input.nextInt();
System.out.print("Ano: ");
int ano = input.nextInt();
input.nextLine();
Data dataFundacao = new Data(dia, mes, ano);
System.out.print("\nCapacidade máxima de produtos no estoque: ");
int capacidade = input.nextInt();
input.nextLine();
System.out.println("\nTipo de loja:");
System.out.println("1 - Cosmético");
System.out.println("2 - Vestuário");
System.out.println("3 - Bijuteria");
System.out.println("4 - Alimentação");
System.out.println("5 - Informática");
System.out.println("6 - Loja comum");
System.out.print("Escolha: ");
int tipo = input.nextInt();
input.nextLine();
switch (tipo) {
case 1:
System.out.print("Taxa de comercialização (%): ");
double taxa = input.nextDouble();
input.nextLine();
return new Cosmetico(nome, qtdFunc, salarioBase, endereco, dataFundacao, capacidade, taxa);
case 2:
System.out.print("Vende produtos importados? (S/N): ");
boolean importados = input.nextLine().equalsIgnoreCase("S");
return new Vestuario(nome, qtdFunc, salarioBase, endereco, dataFundacao, importados, capacidade);
case 3:
System.out.print("Meta de vendas mensais: R$");
double meta = input.nextDouble();
input.nextLine();
return new Bijuteria(nome, qtdFunc, salarioBase, endereco, dataFundacao, meta, capacidade);
case 4:
System.out.println("\nData do alvará:");
System.out.print("Dia: ");
int diaAlvara = input.nextInt();
System.out.print("Mês: ");
int mesAlvara = input.nextInt();
System.out.print("Ano: ");
int anoAlvara = input.nextInt();
input.nextLine();
Data dataAlvara = new Data(diaAlvara, mesAlvara, anoAlvara);
return new Alimentacao(nome, qtdFunc, salarioBase, endereco, dataFundacao, dataAlvara, capacidade);
case 5:
System.out.print("Valor do seguro de eletrônicos: R$");
double seguro = input.nextDouble();
input.nextLine();
return new Informatica(nome, qtdFunc, salarioBase, endereco, dataFundacao, seguro, capacidade);
default:
return new Loja(nome, qtdFunc, salarioBase, endereco, dataFundacao, capacidade);
}
}
// Método auxiliar para criar um produto usando Scanner
private static Produto criarProduto(Scanner input) {
System.out.println("\n--- Cadastro de Produto ---");
System.out.print("Nome do produto: ");
String nome = input.nextLine();
System.out.print("Preço: R$");
double preco = input.nextDouble();
input.nextLine();
System.out.println("Data de validade:");
System.out.print("Dia: ");
int dia = input.nextInt();
System.out.print("Mês: ");
int mes = input.nextInt();
System.out.print("Ano: ");
int ano = input.nextInt();
input.nextLine();
Data validade = new Data(dia, mes, ano);
return new Produto(nome, preco, validade);
}
}