Sei sulla pagina 1di 8

/*Si vuole realizzare in Java un’applicazione per la gestione di un parcheggio

multipiano. L’applicazione deve essere


usata sia dagli utenti del parcheggio (procedure di ingresso e uscita,
verifica esistenza posto libero, calcolo
del costo etc.) che al gestore (statistiche sull’occupazione, calcolo
fatturato etc.). Inoltre deve essere possibile
esportare dati su file di testo ed è necessario implementare una
persistenza dei dati mediante serializzazione. Scrivere
un programma di test delle classi realizzate con interfaccia utente
(testuale) utilizzabile.

Suggerimenti: Un Piano è caratterizzato da un numero (un intero che


identifica il piano), una lista di scontrini (relativi
ai pagamenti per parcheggi effettuati in quel piano) e il numero di posti
disponibili il quale viene decrementato ogni
volta che una macchina occupa un posto nel piano e incrementato ogni volta
che una macchina libera un posto nel
piano. All’ingresso, all’automobilista viene indicato il piano in cui dovrà
recarsi (che è quello con più posti disponibili).
Uno Scontrino è caratterizzato da una data (un oggetto di tipo Data da
implementare), un orario di arrivo (un oggetto
di tipo Orario da implementare), un orario di uscita (un oggetto di tipo
Orario), e da un prezzo pagato. Il prezzo è pari
ad un Euro per ogni ora o frazione di ora di durata della permanenza
all’interno del parcheggio. Una Data è caratterizzata
da tre interi corrispondenti a giorno, mese e anno (oppure si usi la classe
Date di Java). Un Orario è caratterizzato da
due interi, uno corrispondente all’ora ed uno ai minuti. Oltre alle classi
Piano, Scontrino, Data, Orario, potrebbe essere
utile una classe GestioneParcheggio per la gestione delle informazioni
complessive che comprende una opportuna
collezione di riferimenti ad oggetti Piano ed implementa una serie di
metodi utili.*/

import java.io.*;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;

class GestioneParcheggio {
static LinkedList<Piano> piano;
public GestioneParcheggio() {
piano = new LinkedList<>();
}
public static class Piano {
public int COD;
public ArrayList<Scontrino> scontrini;
public int ptot;
public int pdis;
public Piano(int COD, int ptot) {
this.COD = COD;
scontrini = new ArrayList<>();
this.ptot = ptot;
pdis = CalcoloPosti(ptot, scontrini);
}
public int CalcoloPosti(int ptot, ArrayList<Scontrino> s) {
int posti;
if (!(s.isEmpty())) {
posti = ptot - s.size();
} else posti = ptot;

return posti;
}

}
public static class Scontrino {
public int dest;
public int num;
public LocalDate date;
public LocalTime OraA;
public LocalTime OraU;
public int prezzo;
public Scontrino(int num,LocalDate date, LocalTime oraA, LocalTime oraU) {
dest = AssegnaPiano();
this.num = num;
this.date = date;
this.OraA = oraA;
this.OraU = oraU;
prezzo = CalcoloPrezzo(OraA, OraU);
}
public int AssegnaPiano() {
int codmax = 0;
int pmax = 0;
if (!(piano.isEmpty())) {
for (Piano p : piano) {
if (p.pdis > pmax || pmax == 0) {
codmax = p.COD;
pmax = p.pdis;
}

}
} else throw new RuntimeException("ERRORE, ZERO PIANI RILEVATI");
return codmax;
}
public int CalcoloPrezzo(LocalTime in, LocalTime out){
int prezzo;
if(in.getHour() > out.getHour()) prezzo = out.getHour() + 24-
in.getHour();
else prezzo = out.getHour() - in.getHour();
if(out.getMinute() > in.getMinute()) prezzo += 1;
return prezzo;
}

}
public void AddPiano(Piano p) {
piano.add(p);
}
public void AddScontrino(Scontrino s){
if(!(piano.isEmpty())){
for(Piano p : piano) {
if (s.dest == p.COD) {
p.scontrini.add(s);
p.pdis -= 1;
}
}
} else throw new RuntimeException("ERRORE, NESSUN PIANO IN CUI AGGIUNGERE,
INIZIALIZZARE PIANI");
}
public void RimuoviScontrino(Scontrino sctr, ArrayList<Scontrino> scontrini){
for(Piano p : piano){
for(Scontrino s : p.scontrini){
if(s.equals(sctr)){
p.scontrini.remove(s);
scontrini.remove(s);
p.pdis +=1;
System.out.println("SCONTRINO RIMOSSO");
}
}
}
}
public void RimuoviPiano(int num, ArrayList<Piano> piani) {
if(!(piano.isEmpty())){
for(Piano p : piano){
if(p.COD == num){
piano.remove(p);
piani.remove(p);
System.out.println("PIANO N* " +num+ " RIMOSSO CORRETTAMENTE");
}
}
} else throw new RuntimeException("ERRORE, NESSUN PIANO DA RIMUOVERE,
INIZIALIZZARE PIANI");
}
public void StampaPiani(){
for (Piano p : piano) {
System.out.println("COD: " + p.COD + " PTOT: " + p.ptot + " PDIS: "
+ p.pdis);
}
}
public void GetPosti() {
if(!(piano.isEmpty())) {
int tot = 0;
int i = 1;
for (Piano p : piano) {
System.out.println("IL PIANO N*: " +i+ " HA " +p.pdis+ "POSTI
DISPONIBILI");
tot += p.pdis;
i += 1;
}
System.out.println("PER UN TOTALE DI: " +tot);
} else throw new RuntimeException("ERRORE, PRIMA OCCORRE INIZIALIZZARE
PIANI");
}
public void StampaScontrini(){
if(!(piano.isEmpty())) {
for (Piano p : piano) {
if (!(p.scontrini.isEmpty())) {
for (Scontrino s : p.scontrini)
System.out.println("NUMERO SCONTRINO: " + s.num + " ORA
ARRIVO: " + s.OraA + " ORA USCITA: " + s.OraU + " PREZZO PAGATO: EURO " + s.prezzo
+ " PIANO N*: " + s.dest);
}
}
} else throw new RuntimeException("ERRORE, PRIMA OCCORRE INIZIALIZZARE
PIANI");
}
public void StampaPrezzo(){
Scanner sc = new Scanner(System.in);
if(!(piano.isEmpty())){
System.out.print("DIGITA IL NUMERO DI SCONTRINO ");
int num = sc.nextInt();
for(Piano p : piano){
if(!(p.scontrini.isEmpty())){
for(Scontrino s : p.scontrini){
if(s.num == num) System.out.println("LO SCONTRINO NUM*: "
+s.num+ " DALLE " +s.OraA+ " ALLE " +s.OraU+ " HA PREZZO: " +s.prezzo+ " EURO");
}
}
}
}
}
}

public class Main {


public static void Inizializzazione(ArrayList<GestioneParcheggio.Piano> piani,
GestioneParcheggio gestione){
Scanner sc = new Scanner(System.in);
int cod, ptot;
System.out.print("QUANTI PIANI HA LA STRUTTURA? ");
int n = sc.nextInt();
for(int i = 0; i<n; i++){
System.out.print("NUMERO PIANO? ");
cod = sc.nextInt();
System.out.print("NUMERO POSTI? ");
ptot = sc.nextInt();
GestioneParcheggio.Piano p = new GestioneParcheggio.Piano(cod,ptot);
piani.add(p);
}
for(GestioneParcheggio.Piano p : piani){
gestione.AddPiano(p);
}
}
public static int Menu(){
Scanner sc = new Scanner(System.in);
int index;

System.out.println("DIGITARE UN NUMERO DAL MENU' PER SCEGLIERE UN OPZIONE


[0 - 7]");
System.out.println("0. CREA PIANO");
System.out.println("1. RIMUOVI PIANO");
System.out.println("2. STAMPA PIANI");
System.out.println("3. CREA TICKET");
System.out.println("4. RIMUOVI TICKET");
System.out.println("5. STAMPA TICKET");
System.out.println("6. STAMPA PREZZO TICKET");
System.out.println("7. POSTI DISPONIBILI");
index = sc.nextInt();
return index;
}
public static void Case0(ArrayList<GestioneParcheggio.Piano> piani,
GestioneParcheggio gestione, ArrayList<GestioneParcheggio.Scontrino> scontrini){
Scanner sc = new Scanner(System.in);
System.out.print("NUMERO DEL PIANO? ");
int COD = sc.nextInt();
System.out.print("NUMERO POSTI DEL PIANO? ");
int ptot = sc.nextInt();
GestioneParcheggio.Piano p = new GestioneParcheggio.Piano(COD,ptot);
piani.add(p);
gestione.AddPiano(p);
if((scontrini.size())>0){
for(GestioneParcheggio.Scontrino s : scontrini){
if(s.dest == p.COD) {
p.scontrini.add(s);
p.pdis -= 1;
}
}
}
}
public static void Case1(GestioneParcheggio gestione, int num,
ArrayList<GestioneParcheggio.Piano> piani){
gestione.RimuoviPiano(num, piani);
System.out.print("PIANO RIMOSSO");
}
public static void Case3(GestioneParcheggio gestione,
ArrayList<GestioneParcheggio.Scontrino> scontrini){
Scanner sc = new Scanner(System.in);
LocalDate oggi = LocalDate.now();

System.out.print("INSERISCI NUMERO SCONTRINO ");


int num = sc.nextInt();
LocalTime OraA = getOrario("INGRESSO");
LocalTime OraU = getOrario("USCITA");
GestioneParcheggio.Scontrino s = new
GestioneParcheggio.Scontrino(num,oggi,OraA,OraU);
scontrini.add(s);
gestione.AddScontrino(s);
System.out.print("SCONTRINO AGGIUNTO ");
}
public static LocalTime getOrario(String s){
Scanner sc = new Scanner(System.in);

System.out.print("INSERISCI ORA ["+s+"]: ");


int h = sc.nextInt();
System.out.print("INSERISCI MINUTI ["+s+"]: ");
int m = sc.nextInt();
return LocalTime.of(h,m);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int index;
String strg;
GestioneParcheggio gestione = new GestioneParcheggio();
ArrayList<GestioneParcheggio.Piano> piani = new ArrayList<>();
ArrayList<GestioneParcheggio.Scontrino> scontrini = new ArrayList<>();

String path = "GP.txt";


try {
File fn = new File(path);
if(fn.exists()){
FileReader fr = new FileReader(fn);
BufferedReader br = new BufferedReader(fr);
String test;
while((test = br.readLine()) != null){
String[] line = test.split("\\s");
if(line[0].equals("COD:")){
GestioneParcheggio.Piano p = new
GestioneParcheggio.Piano((Integer.parseInt(line[1])), (Integer.parseInt(line[3])));
gestione.AddPiano(p);
piani.add(p);
} else if (line[0].equals("NUM:")) {
GestioneParcheggio.Scontrino s = new
GestioneParcheggio.Scontrino((Integer.parseInt(line[1])),
(LocalDate.parse(line[3])), (LocalTime.parse(line[5])),
(LocalTime.parse(line[7])));
gestione.AddScontrino(s);
scontrini.add(s);
}
}
br.close();
do{
index = Menu();
switch (index) {
//CREA UN NUOVO PIANO
case 0 -> Case0(piani, gestione, scontrini);
//RIMUOVE UN PIANO A SCELTA
case 1 -> {
System.out.println("CHE PIANO VUOI RIMUOVERE? ");
int num = sc.nextInt();
Case1(gestione, num, piani);
}
//STAMPA TUTTI I DATI DEI PIANI
case 2 -> gestione.StampaPiani();
//CREA UN NUOVO SCONTRINO
case 3 -> Case3(gestione, scontrini);
//RIMUOVE UNO SCONTRINO A SCELTA
case 4 -> {
System.out.println("DIGITARE NUMERO DI SCONTRINO DA
RIMUOVERE: ");
int num = sc.nextInt();
for(GestioneParcheggio.Scontrino sctr : scontrini){
if(sctr.num == num) {
gestione.RimuoviScontrino(sctr, scontrini);
}
}
}
//STAMPA TUTTI I DATI DEGLI SCONTRINI
case 5 -> gestione.StampaScontrini();
//STAMPA IL PREZZO DI UNO SCONTRINO A SCELTA
case 6 -> gestione.StampaPrezzo();
//STAMPA TUTTI I POSTI DISPONIBILI DEI PIANI, IN LISTA,
SEGUITI DAL NUMERO DI POSTI TOTALI
case 7 -> gestione.GetPosti();
}
System.out.println("IMMETTERE UN'ALTRA OPZIONE? [SI/NO]: ");
strg = sc.next();
} while(strg.equals("si"));
File ft = new File("temp.txt");
FileWriter fw = new FileWriter(ft);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("NUMERO PIANI: " +piani.size());
bw.newLine();
bw.write("NUMERO SCONTRINI ATTIVI: " +scontrini.size());
bw.newLine();
for(GestioneParcheggio.Piano p : piani){
bw.write("COD: " +p.COD+ " PTOT: " +p.ptot+ " PDIS: " +p.pdis);
bw.newLine();
}
bw.write("-");
bw.newLine();
for(GestioneParcheggio.Scontrino s : scontrini){
bw.write("NUM: " +s.num+ " DATA: " +s.date+ " DALLE: " +s.OraA+
" ALLE: " +s.OraU);
bw.newLine();
}
bw.close();
fn.delete();
ft.renameTo(fn);
} else if (fn.createNewFile()) {
//INIZIALIZZAZIONE PIANI
Inizializzazione(piani,gestione);
do {
index = Menu();
switch (index) {
//CREA UN NUOVO PIANO
case 0 -> Case0(piani, gestione, scontrini);
//RIMUOVE UN PIANO A SCELTA
case 1 -> {
System.out.println("CHE PIANO VUOI RIMUOVERE? ");
int num = sc.nextInt();
Case1(gestione, num, piani);
}
//STAMPA TUTTI I DATI DEI PIANI
case 2 -> gestione.StampaPiani();
//CREA UN NUOVO SCONTRINO
case 3 -> Case3(gestione, scontrini);
//RIMUOVE UNO SCONTRINO A SCELTA
case 4 -> {
System.out.println("DIGITARE NUMERO DI SCONTRINO DA
RIMUOVERE: ");
int num = sc.nextInt();
for(GestioneParcheggio.Scontrino sctr : scontrini){
if(sctr.num == num) {
gestione.RimuoviScontrino(sctr, scontrini);
}
}
}
//STAMPA TUTTI I DATI DEGLI SCONTRINI
case 5 -> gestione.StampaScontrini();
//STAMPA IL PREZZO DI UNO SCONTRINO A SCELTA
case 6 -> gestione.StampaPrezzo();
//STAMPA TUTTI I POSTI DISPONIBILI DEI PIANI, IN LISTA,
SEGUITI DAL NUMERO DI POSTI TOTALI
case 7 -> gestione.GetPosti();
}
System.out.println("IMMETTERE UN'ALTRA OPZIONE? [SI/NO]: ");
strg = sc.next();
} while(strg.equals("si"));
//SCRITTURA SU FILE
FileWriter fw = new FileWriter(fn);
BufferedWriter bw = new BufferedWriter(fw);
bw.write("NUMERO PIANI: " +piani.size());
bw.newLine();
bw.write("NUMERO SCONTRINI ATTIVI: " +scontrini.size());
bw.newLine();
for(GestioneParcheggio.Piano p : piani){
bw.write("COD: " +p.COD+ " PTOT: " +p.ptot+ " PDIS: " +p.pdis);
bw.newLine();
}
bw.write("-");
bw.newLine();
for(GestioneParcheggio.Scontrino s : scontrini){
bw.write("NUM: " +s.num+ " DATA: " +s.date+ " DALLE: " +s.OraA+
" ALLE: " +s.OraU);
bw.newLine();
}
bw.close();
} else System.out.println("IL FILE NON PUO' ESSERE CREATO");
} catch (IOException e) {
e.printStackTrace();
}
}
}

Potrebbero piacerti anche