Esercizio riferimenti icrociati JAVA

di il
8 risposte

Esercizio riferimenti icrociati JAVA

Salve a tutti gli utenti
devo risolvere un esercizio Java per la gestione degli accessi ad alcune piste da sci mediante Skipass.
Le piste sono rappresentate dal file piste.txt cosi organizzato:

nome pista(Es. Settevalli)
difficoltà(es. intermedia)
Orario apertura
orario chiusura
costo di accesso(es. 5 euro)

Gli Skipass sono rappresentati dal file skipass.txt cosi organizzato:

codice skipass
credito(es. 150) euro
cod fiscale del possessore
Elenco Piste accedute(varia da skipass in skipass, ovviamente l'elenco è vuoto all'atto dell'acquisto)
#(simbolo che conclude l'elenco delle piste accedute)

Infine i dati dei possessori di Skipass sono organizzati el file sciatori.txt cosi composto:

cod fiscale
nome
cognome
città
numero di tel

Devo implementare i vari filtri compreso un metodo che quando uno sciatore si presenta ad una pista verifichi se il credito sullo skipass è sufficiente per accedervi e in tal caso aggiornare l'elenco delle piste accedute sullo skipass.
Ho dunque provveduto a creare la prima classe Pista:


public class Pista {
    private String nome,tipo;
     private double costo;
     private Date oraA,oraC;
    
    public Pista (String nome, String tipo, Date oraA, Date oraC, double costo){
        this.nome=nome;
        this.tipo=tipo;
        this.oraA=oraA;
        this.oraC=oraC;
        this.costo=costo;
        
    }


    public String getNome() {
        return nome;
    }


    public String getTipo() {
        return tipo;
    }


    public double getCosto() {
        return costo;
    }


    public Date getOraA() {
        return oraA;
    }


    public Date getOraC() {
        return oraC;
    }
    
    public static Pista read(Scanner sc) throws ParseException{
        String nome,tipo;
        Date oraA,oraC;
        double costo;
        if(!sc.hasNextLine())return null;
        nome=sc.nextLine();
        if(!sc.hasNextLine())return null;
        tipo=sc.nextLine();
        if(!sc.hasNextLine())return null;
        oraA=(new SimpleDateFormat("HH:mm:ss").parse(sc.nextLine()));
        if(!sc.hasNextLine())return null;
        oraC=(new SimpleDateFormat("HH:mm:ss").parse(sc.nextLine()));
        if(!sc.hasNextLine())return null;
        costo=Double.parseDouble(sc.nextLine());
        return new Pista(nome,tipo,oraA,oraC,costo);
            
    }
    
    public void stampa(PrintStream p){
        p.println(nome);
        p.println(tipo);
        p.println(oraA);
        p.println(oraC);
        p.println(costo);
    }


}
Poi la classe sciatore:


public class Sciatore {
     private String cf,nome,cognome,città,num;
    
    public Sciatore(String cf,String nome,String cognome,String città, String num){
        this.cf=cf;
        this.nome=nome;
        this.cognome=cognome;
        this.città=città;
        this.num=num;
    }


    public String getCf() {
        return cf;
    }


    public String getNome() {
        return nome;
    }


    public String getCognome() {
        return cognome;
    }


    public String getCittà() {
        return città;
    }


    public String getNum() {
        return num;
    }
 public static Sciatore read(Scanner sc){
 String cf,nome,cognome,città,num;
 if(!sc.hasNextLine())return null;
 cf=sc.nextLine();
 if(!sc.hasNextLine())return null;
 nome=sc.nextLine();
 if(!sc.hasNextLine())return null;
 cognome=sc.nextLine();
 if(!sc.hasNextLine())return null;
 città=sc.nextLine();
 if(!sc.hasNextLine())return null;
 num=sc.nextLine();
 return new Sciatore (cf,nome,cognome,città,num);
}
 public void stampa(PrintStream p){
     p.println(cf);
     p.println(nome);
     p.println(cognome);
     p.println(città);
     p.println(num);
 }
Il Problema sorge nella classe Skipass che a quanto ho capito dovrebbe referenziare le altre due solo che non so come fare ne per il costruttore ne per il metodo read, io stavo procedendo cosi ma credo che il procedimento sia del tutto errato :

public class Skipass{
     private String codice;
     private Sciatore possessore;
     private Double costo;
     private Pista piste;
     private ArrayList<String>piste;
    
public Skipass (String codice,Double costo,Sciatore possessore, ArrayList<String> piste){
        this.codice=codice;
        this.costo=costo;
        this.possessore=possessore;
        this.piste=piste;
    }


    public Sciatore getPossessore() {
        return possessore;
    }


    public void setPossessore(Sciatore possessore) {
        this.possessore = possessore;
    }


   

	public ArrayList<String> getPiste() {
		return piste;
	}


	public void setPiste(ArrayList<String> piste) {
		this.piste = piste;
	}


    public String getCodice() {
        return codice;
    }


    public Double getCosto() {
        return costo;
    }
public static Skipass read(Scanner sca) throws ParseException, FileNotFoundException{
	String codice;
    double costo;
    String possessore;
    if(!sca.hasNextLine())return null;
    codice=sca.nextLine();
    if(!sca.hasNextLine())return null;
    costo=Double.parseDouble(sca.nextLine());
    if(!sca.hasNextLine())return null;
    possessore = sca.nextLine();
    ArrayList<String> piste = new ArrayList<String>();
	String s = sca.nextLine();
	while(!s.equals("#")){
                      piste.add(s);
		      s=sca.nextLine();
		}
        
		return new Skipass(codice,costo,possessore,piste);
         }

 public void stampa(PrintStream pr ){
	pr.println(codice);
	pr.println(costo);
	pr.println(possessore);
	for(String a : piste)
		pr.println(a);
	}
    
A questo punto mi sono fermato e chiedo gentilmente il vostro aiuto
Grazie in anticipo

8 Risposte

  • Re: Esercizio riferimenti icrociati JAVA

    Modello Concettuale, questo sconosciuto

    Una cosa non ho capito ma un cliente può avere un solo skypass o ne può possedere molti?

    Se è un'associazione uno ad uno allora al cliente devi mettere un riferimento allo skypass se è uno a molti devi mettere una lista di riferimenti.

    Stesso vale tra skypass e Piste, io metterei una lista di riferimenti alle piste che sono state acquistate tramite uno specifico skypass.

    Poi per le azioni io implementerei un azione che verifica se il saldo permette di accedere ad una pista e un'azione che ti permetta l'acquisto.

    Però volendo si può fare tutto insieme, questo dipende da come vuoi organizzare tu il codice e da come vuoi che funzioni la tua applicazione.
  • Re: Esercizio riferimenti icrociati JAVA

    Sono riuscito a completare la ''base'' della classe skipass, ora dovrei fare una classe gestore dove gestire riferimenti classi e implementare i metodi ma non ho la piu pallida idea di come continuare.

    Uno sciatore può avere un solo skipass, cosa intendi per mettere un riferimento dello skipass nello sciatore?
    Sono ancora alle prime armi, potresti farmi vedere come modificheresti la mia classe Sciatore mettendo questo riferimento?
    Poi nel gestore dovrei fare una mappa che metta in relazione le classi? Perchè se si non so proprio come dover procedere.
  • Re: Esercizio riferimenti icrociati JAVA

    Potresti postare le tre classi? così ci do un'occhiata e ti dico come l'avrei fatte io.
  • Re: Esercizio riferimenti icrociati JAVA

    Le ho scrtte tutte nel Post principale, la classe Pista,Sciatore e Skipass
    Per caricartele materialmente dalla mia cartella nel workspace non saprei come fare
  • Re: Esercizio riferimenti icrociati JAVA

    Ti do un piccolo consiglio, studia bene il modello concettuale, non ci crederai ma è fondamentale!

    Dando un'occhiata veloce mi sembra che le classi Skypass e sciatore vadano bene.

    Nella classe piste devi aggiungere una lista di skypass, io farei in questo modo:
    
    private List<Skypass> listaSkypass = new ArrayList <Skypass>()
    
    e poi i metodi get e set
    
     public Skypass getSKypass(int i) {
            return listaSkypass.get(i);
        }
    
    
     public void setSkypass(Skypass skypass) {
            this.listaSkypass.add(prenotazione);
        }
    
    Ed aggiungerei una classe che potresti chiamare impiantoSciistico
    
    public class ImpiantoSciistico {
        private List<Piste> listaPiste = new ArrayList <Piste>();
    
        public void setPista(Pista p) {
            this.listaPiste.add(p);
        }
    
        public Piste getPiste(int i) {
            return this.listaPiste.get(i);
        }
    
        public int numeroPiste() {
            return this.listaPiste.size();
        }
    
    }
    
    Diciamo che io mi sarei approcciato in questo modo.
  • Re: Esercizio riferimenti icrociati JAVA

    Ti ringrazio per l'aiuto che mi stai dando
    cmq non riesco a capire a ccosa mettere una Lista di Skipass nella classe piste

    Nella Classe che gestisce il tutto alla fine che io chiamo semplicemente gestore,dovrei implementare un un metodo che quando uno sciatore si presenta ad una pista verifichi se il credito sul suo skipass è sufficiente per accedervi e in tal caso aggiornare l'elenco delle piste accedute sullo skipass.

    Per semplicità mettiamo che passo al metodo due stringhe, la prima che rappresenta il codice fiscale della persona che vuole accedere alla Pista e la seconda stringa è il nome della Pista alla quale vuole accedere.
    Con un operazione di confronto individuo lo skipass che ha lo stesso cf che io ho passato al metodo;dovrei quindi verificare che il credito presente nello skipass sia maggiore al costo d'accesso per la pista desiderata ed è qui che non capisco come collegarmi alla classe Pista, dato che le due classi non hanno attributi in comune che posso usare come chiave.
    In che modo posso usare lo skipass che ho inserito nella classe pista?
  • Re: Esercizio riferimenti icrociati JAVA

    Siccome noto che sei alle prime armi mi permetto di darti dei piccoli consigli.

    Primo studia bene il modello concettuale che a mio avviso è fondamentale per capire come dovrebbe funzionare l'applicazione e le varie relazioni tra le classi.

    In questo caso specifico, se non ho capito male, dovresti poter visionare anche tutte le piste a cui hai avuto accesso.

    Vedila così, in tuo impianto sciistico ha 4 piste: A,B,C,D. ovviamente ci sono vari cliente e ad ogni cliente corrisponde solamente uno skypass.

    In una pista sciistica può essere stata frequentata da uno o più clienti e quindi essere stata acquistata da uno o più skypass, ma l'acquisto specifico di una pista può essere presente solo e solamente in uno skypass(Es. l'entrata alla pista A di oggi da parte di un cliente X può essere presente solo nello skypass Y appartenete ad X, giusto)?

    Quindi avrai una relazione 1 a * e nella classe Pista vanno inserite una lista di Skypass che sono tutti quelli che l'hanno acquistata.

    Spero di essere stato chiaro su questo punto.

    Passiamo ai metodi che dovresti implementare.

    Io personalmente ne farei sempre due,uno per verifica cf e skypass ed un altro per l'acquisto.

    Io ti consiglierei di studiare un altro po' e provare tu stesso a scrivere un po' di codice e postarlo ti assicuro che ti sarà molto più di aiuto di quanto te ne possa essere io.
  • Re: Esercizio riferimenti icrociati JAVA

    Grazie mille, proverò a seguire i tuoi consigli
Devi accedere o registrarti per scrivere nel forum
8 risposte