Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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);
}
}