/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template */ package listaspesa; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.InputMismatchException; import java.util.Scanner; /** * * @author Verde */ public class listaSpesa { /** * @param args the command line arguments */ static Scanner sc = new Scanner(System.in); static Prodotto magazzino[] = null; static Prodotto scontrino[] = null; static int dimensioneMagazzino = 0, dimensioneScontrino = 0; static String datePattern = "dd/MM/yyyy"; static SimpleDateFormat sdf = new SimpleDateFormat(datePattern); public static void main(String[] args) { int scelta = -1; boolean error; do { System.out.println("Scegliere un'opzione:"); System.out.println("1. Modifica inventario"); System.out.println("2. Inserimento scontrino"); System.out.println("3. Stampa scontrino"); System.out.println("4. Rimuovi prodotti scaduti"); System.out.println("0. Esci"); System.out.print("Opzione: "); try { scelta = sc.nextInt(); sc.nextLine(); switch (scelta) { case 0: break; case 1: do { try { error = false; System.out.print("Quanti prodotti inserire? "); dimensioneMagazzino = sc.nextInt(); sc.nextLine(); if (dimensioneMagazzino <= 0) { System.out.println("Errore: è necessario inserire almeno un prodotto."); pausa(); error = true; } } catch (InputMismatchException e) { System.out.println("Errore: numero non valido."); pausa(); error = true; } } while (error); if (magazzino == null) { magazzino = new Prodotto[dimensioneMagazzino]; for (int i = 0; i < dimensioneMagazzino; i++) { inserisciProdotto(); System.out.println("Prodotto inserito con successo."); pausa(); } } else { magazzino = Arrays.copyOf(magazzino, magazzino.length + dimensioneMagazzino, magazzino.getClass()); for (int i = magazzino.length - dimensioneMagazzino; i < magazzino.length; i++) { inserisciProdotto(); System.out.println("Prodotto inserito con successo."); pausa(); } } System.out.println("Tutti i prodotti sono stati inseriti con successo."); pausa(); break; case 2: if (magazzino != null) { do { try { error = false; System.out.print("Quanti prodotti inserire? "); dimensioneScontrino = sc.nextInt(); sc.nextLine(); if (dimensioneScontrino <= 0) { System.out.println("Errore: è necessario inserire almeno un prodotto."); pausa(); error = true; } } catch (InputMismatchException e) { System.out.println("Errore: numero non valido."); pausa(); error = true; } } while (error); if (scontrino == null) { scontrino = new Prodotto[dimensioneScontrino]; for (int i = 0; i < dimensioneScontrino; i++) { inserisciDatiScontrino(); } } else { scontrino = Arrays.copyOf(scontrino, scontrino.length + dimensioneScontrino, scontrino.getClass()); for (int i = scontrino.length - dimensioneScontrino; i < scontrino.length; i++) { inserisciDatiScontrino(); } } System.out.println("Tutti i prodotti sono stati inseriti con successo."); } else { System.out.println( "Errore: è necessario popolare il magazzino prima di poter creare lo scontrino."); } pausa(); break; case 3: if (scontrino != null) { stampaScontrino(); } else { System.out.println("Errore: è necessario inserire uno scontrino prima di mostrarlo."); } pausa(); break; case 4: if (magazzino != null) { rimuoviScaduti(); } else { System.out.println( "Errore: è necessario inserire almeno un prodotto nel magazzino prima di rimuovere quelli scaduti."); } pausa(); break; default: System.out.println("Opzione non valida."); pausa(); break; } } catch (InputMismatchException e) { System.out.println("Errore: scelta non valida."); pausa(); } } while (scelta != 0); } public static void pausa() { System.out.println("Premere un tasto per continuare. . ."); sc.nextLine(); } public static void inserisciProdotto() { String nome; float prezzo = 0; float qta = 0; float scontoFidelityCard = 0; Date dataScadenza = null; String tipoMateriale = null; boolean error = false, isAlimentare = true; String scelta; String descrizione; Prodotto prodotto; do { System.out.print("Inserire il nome: "); nome = sc.nextLine().trim(); System.out.print("Inserire la descrizione: "); descrizione = sc.nextLine().trim(); do { try { error = false; System.out.print("Inserire il prezzo: "); prezzo = sc.nextFloat(); sc.nextLine(); if (prezzo <= 0) { System.out.println("Errore: non è possibile inserire un prezzo minore o uguale a zero."); pausa(); error = true; } } catch (InputMismatchException e) { System.out.println("Errore: numero non valido."); pausa(); error = true; } } while (error); do { try { error = false; System.out.print("Inserire lo sconto con carta fedeltà (in %): "); scontoFidelityCard = sc.nextFloat() / 100; sc.nextLine(); if (scontoFidelityCard < 0) { System.out.println("Errore: non è possibile inserire uno sconto negativo."); pausa(); error = true; } } catch (InputMismatchException e) { System.out.println("Errore: numero non valido."); } } while (error); do { error = false; System.out.print("Il prodotto è un genere alimentare? [S/n] "); scelta = sc.nextLine().toLowerCase().trim(); if (scelta.equals("y") || scelta.equals("s") || scelta.equals("")) { isAlimentare = true; do { error = false; try { System.out.print("Inserire la data di scadenza nel formato " + datePattern + ": "); dataScadenza = sdf.parse(sc.nextLine().trim()); } catch (ParseException e) { System.out.println("Errore nella lettura della data."); pausa(); error = true; } } while (error); } else if (scelta.equals("n")) { isAlimentare = false; System.out.print("Inserire il materiale del prodotto: "); tipoMateriale = sc.nextLine().trim(); } else { System.out.println("Errore: opzione non valida."); pausa(); error = true; } } while (error); do { try { error = false; System.out.print("Inserire la quantità: "); qta = isAlimentare ? sc.nextFloat() : (float) sc.nextInt(); sc.nextLine(); if (qta <= 0) { System.out.println("Errore: non è possibile inserire meno di un prodotto."); pausa(); error = true; } } catch (InputMismatchException e) { System.out.println("Errore: numero non valido."); } } while (error); if (isAlimentare) { prodotto = new Alimentare(nome, prezzo, qta, scontoFidelityCard, dataScadenza, descrizione); } else { prodotto = new NonAlimentare(nome, prezzo, qta, scontoFidelityCard, tipoMateriale, descrizione); } if (trovaProdottoInMagazzino(prodotto) == -1) { magazzino[trovaPosizioneLibera(magazzino)] = prodotto; } else { System.out.println("Errore: il prodotto esiste già nel magazzino."); pausa(); error = true; } } while (error); } public static void inserisciDatiScontrino() { boolean error, isAlimentare = false, useNomeProdotto = false, exit = false; String scelta, nomeODescrizione; float qta = 0; Prodotto prodottoTrovato; do { do { error = false; System.out.print("Il prodotto è un genere alimentare? [S/n] "); scelta = sc.nextLine().toLowerCase().trim(); if (scelta.equals("y") || scelta.equals("s") || scelta.equals("")) { isAlimentare = true; } else if (scelta.equals("n")) { isAlimentare = false; } else { System.out.println("Errore: opzione non valida."); pausa(); error = true; } } while (error); do { error = false; System.out.println("Opzioni ammesse: nome, descrizione."); System.out.print("Inserire il nome del prodotto o la sua descrizione? "); scelta = sc.nextLine().toLowerCase().trim(); if (scelta.equals("nome")) { useNomeProdotto = true; } else if (scelta.equals("descrizione")) { useNomeProdotto = false; } else { System.out.println("Opzioni ammesse: nome, descrizione."); System.out.println("Errore: opzione non valida."); pausa(); error = true; } } while (error); System.out.print("Inserire " + (useNomeProdotto ? "il nome" : "la descrizione") + " del prodotto:" + (useNomeProdotto ? " " : "\n")); nomeODescrizione = sc.nextLine().trim(); if (ricercaProdotto(nomeODescrizione, isAlimentare)) { Prodotto prodottiTrovati[] = ricercaProdotto(nomeODescrizione); if (prodottiTrovati.length == 1) { prodottoTrovato = prodottiTrovati[0]; System.out.println("Prodotto trovato: "); prodottoTrovato.stampaDati(); } else { System.out.println("Sono stati trovati i seguenti prodotti: "); for (int i = 0; i < prodottiTrovati.length; i++) { System.out.println("Prodotto n. " + i); prodottiTrovati[i].stampaDati(); System.out.println(); } int indice = 0; System.out.println(); do { error = false; try { System.out.print("Inserire il numero di prodotto desiderato: "); indice = sc.nextInt(); sc.nextLine(); if (indice < 0 || indice >= prodottiTrovati.length) { System.out.println("Errore: numero di prodotto non valido."); pausa(); error = true; } } catch (InputMismatchException e) { System.out.println("Errore: numero non valido."); pausa(); error = true; } } while (error); prodottoTrovato = prodottiTrovati[indice]; } do { error = false; System.out.print("È corretto? [S/n] "); scelta = sc.nextLine().toLowerCase().trim(); if (scelta.equals("y") || scelta.equals("s") || scelta.equals("")) { do { error = false; do { try { error = false; System.out.print("Inserire la quantità: "); qta = isAlimentare ? sc.nextFloat() : (float) sc.nextInt(); sc.nextLine(); if (qta <= 0) { System.out.println("Errore: non è possibile inserire meno di un prodotto."); pausa(); error = true; } } catch (InputMismatchException e) { System.out.println("Errore: numero non valido."); pausa(); error = true; } } while (error); if (prodottoTrovato.checkQtaDisponibile( useNomeProdotto ? nomeODescrizione : prodottoTrovato.getNome(), qta) != 0) { if (qta <= prodottoTrovato.checkQtaDisponibile( useNomeProdotto ? nomeODescrizione : prodottoTrovato.getNome(), qta)) { if (trovaProdottoInScontrino(prodottoTrovato) == -1) { if (prodottoTrovato.getQta() - qta == 0) { System.out.println("Attenzione: il prodotto è stato finito."); scontrino[trovaPosizioneLibera(scontrino)] = prodottoTrovato; magazzino[trovaProdottoInMagazzino(prodottoTrovato)] = null; } else { int posizioneScontrino = trovaPosizioneLibera(scontrino); prodottoTrovato.updQtaMagazzino( useNomeProdotto ? nomeODescrizione : prodottoTrovato.getNome(), prodottoTrovato.getQta() - qta); scontrino[posizioneScontrino] = isAlimentare ? new Alimentare((Alimentare) prodottoTrovato) : new NonAlimentare((NonAlimentare) prodottoTrovato); scontrino[posizioneScontrino].updQtaMagazzino( useNomeProdotto ? nomeODescrizione : prodottoTrovato.getNome(), qta); } exit = true; } else { System.out.println("Errore: il prodotto esiste già nello scontrino."); pausa(); error = true; } } else { System.out.println("Errore: la quantità inserita supera quella disponibile, ovvero " + prodottoTrovato.getQta()); pausa(); error = true; } } else { System.out.println("Errore: il nome non è corretto."); pausa(); error = true; } } while (error); } else if (scelta.equals("n")) { System.out.println("Se il prodotto non è stato trovato, provare a scrivere un" + (useNomeProdotto ? " nome" : "a descrizione") + " più precis" + (useNomeProdotto ? "o" : "a") + " o a ricercare per " + (useNomeProdotto ? "descrizione" : "nome") + "."); break; } else { System.out.println("Errore: opzione non valida."); pausa(); error = true; } } while (error); } else { System.out.println("Errore: prodotto non trovato."); System.out.println("Provare a scrivere un" + (useNomeProdotto ? " nome" : "a descrizione") + " più precis" + (useNomeProdotto ? "o" : "a") + " o a ricercare per " + (useNomeProdotto ? "descrizione" : "nome") + "."); pausa(); } } while (scelta.equals("n") || !exit); } public static void stampaScontrino() { boolean error, fidelityCard = false; String scelta; do { error = false; System.out.print("Si ha la carta fedeltà? [S/n] "); scelta = sc.nextLine().toLowerCase().trim(); if (scelta.equals("y") || scelta.equals("s") || scelta.equals("")) { fidelityCard = true; } else if (scelta.equals("n")) { fidelityCard = false; } else { System.out.println("Errore: opzione non valida."); pausa(); error = true; } } while (error); for (Prodotto prodotto : scontrino) { prodotto.stampaDati(); System.out.println(); } System.out.println("Totale scontrino: " + totaleScontrino(fidelityCard)); } public static boolean ricercaProdotto(String nome, boolean isAlimentare) { // prodottoExists boolean ritorno = false; for (int i = 0; i < magazzino.length && !ritorno; i++) { if (isAlimentare) { if (magazzino[i] != null && magazzino[i].getClass().getSimpleName().equals("Alimentare")) { ritorno = magazzino[i].getNome().contains(nome) || magazzino[i].getDescrizione().contains(nome); } } else { if (magazzino[i] != null && magazzino[i].getClass().getSimpleName().equals("NonAlimentare")) { ritorno = magazzino[i].getNome().contains(nome) || magazzino[i].getDescrizione().contains(nome); } } } return ritorno; } static Prodotto[] ricercaProdotto(String p_nomeODescrizione) { Prodotto ritorno[] = null; int dimensione = 0; for (Prodotto prodotto : magazzino) { if (prodotto != null && (prodotto.getNome().contains(p_nomeODescrizione) || prodotto.getDescrizione().contains(p_nomeODescrizione))) { ritorno = ritorno == null ? new Prodotto[1] : Arrays.copyOf(ritorno, dimensione + 1, ritorno.getClass()); ritorno[dimensione] = prodotto; dimensione++; } } return ritorno; } static int trovaProdottoInMagazzino(Prodotto p_prodotto) { int ritorno = -1; boolean exit = true; for (int i = 0; i < magazzino.length && exit; i++) { if (magazzino[i] != null) { exit = false; } } for (int i = 0; i < magazzino.length && !exit; i++) { if (magazzino[i] != null) { if (magazzino[i].isEqual(p_prodotto)) { ritorno = i; exit = true; } } } return ritorno; } static int trovaProdottoInScontrino(Prodotto p_prodotto) { int ritorno = -1; boolean exit = true; for (int i = 0; i < scontrino.length && exit; i++) { if (scontrino[i] != null) { exit = false; } } for (int i = 0; i < scontrino.length && !exit; i++) { if (scontrino[i] != null) { if (scontrino[i].isEqual(p_prodotto)) { ritorno = i; exit = true; } } } return ritorno; } static int trovaPosizioneLibera(Prodotto[] p_prodotti) { int ritorno = -1; boolean exit = false; for (int i = 0; i < p_prodotti.length && !exit; i++) { if (p_prodotti[i] == null) { ritorno = i; exit = true; } } return ritorno; } static float totaleScontrino(boolean p_fidelityCard) { float ritorno = 0; for (Prodotto prodotto : scontrino) { if (p_fidelityCard) { prodotto.applicaSconto(); } ritorno += prodotto.getPrezzo() * prodotto.getQta(); } return ritorno; } static void rimuoviScaduti() { int dimensione = 0; Alimentare alimentari[] = null; for (Prodotto prodotto : magazzino) { if (prodotto.getClass().getSimpleName().equals("Alimentare")) { alimentari = alimentari == null ? new Alimentare[1] : Arrays.copyOf(alimentari, dimensione + 1, alimentari.getClass()); alimentari[dimensione] = (Alimentare) prodotto; dimensione++; } } if (alimentari != null) { for (Alimentare alimentare : alimentari) { alimentare.rimuoviProdottoScaduto(); } } rimouviInvalidi(); } static void rimouviInvalidi() { for (int i = 0; i < magazzino.length; i++) { if (magazzino[i].getQta() == -1) { magazzino[i] = null; } } } }