Skip to content

Update Troubleshooting.md #1558

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

Fernando-Fleck
Copy link

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;

     while (true) {
         System.out.println("\n=== GERENCIADOR DE SHOPPING ===");
         System.out.println("1. Criar loja");
         System.out.println("2. Criar produto");
         System.out.println("3. Sair");
         System.out.print("Opção: ");
         int opcao = input.nextInt();
         input.nextLine();
         if (opcao == 3) break;
         switch (opcao) {
             case 1:
                 loja = criarLoja(input);
                 break;
             case 2:
                 produto = criarProduto(input);
                 break;
             default:
                 System.out.println("Opção inválida!");
         }
     }
     if (produto != null) {
         Data hoje = new Data(20, 10, 2023);
         System.out.println(produto.estaVencido(hoje) ? "\nPRODUTO VENCIDO" : "\nPRODUTO NÃO VENCIDO");
     }
     if (loja != null) {
         System.out.println("\nDADOS DA LOJA:\n" + loja);
     }
     input.close();
    

    }

    // 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);
    }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant