Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Leggere da file

Hybrid View

  1. #1

    Leggere da file

    Salve a tutti, ho un problema con il seguente esercizio:
    "Un mobilificio vuole informatizzare la gestione dei clienti e dei preventivi. I dati relativi ai clienti sono memorizzari in un file "clienti.txt", organizzato come segue:
    Codice Fiscale
    Nome
    Cognome
    Indirizzo

    Codice Fiscale
    Nome
    Cognome
    Indirizzo

    .....
    I preventivi sono memorizzati in un file "preventivi.txt". Ogni preventivo contiene i seguenti dati organizzati nel seguente modo:
    Identificativo preventivo
    Data
    Codice Fiscale richiedente
    Sconto applicato
    Mobile1
    TipoMobile1
    Quantit�Mobile1
    PrezzoMobile1
    Mobile2
    TipoMobile2
    Quantit�Mobile2
    PrezzoMobile2
    ....
    #
    Identificativo preventivo
    Data
    Codice Fiscale richiedente
    Sconto applicato
    Mobile1
    TipoMobile1
    Quantit�Mobile1
    PrezzoMobile1
    Mobile2
    TipoMobile2
    Quantit�Mobile2
    PrezzoMobile2
    ....
    Scrivere un programma che:
    • implementi le classi necessarie per la gestione dei preventivi
    • stampi l'elenco di tutti i preventivi con il costo previsto prima e dopo l'applicazione dello sconto
    • dato il nome ed il cognome di un cliente, stampi i dati di tutti i preventivi richiesti da tale cliente con il costo di ciascuno di essi al netto dello sconto"


    per ora ho scritto le seguenti classi:
    • La classe clienti

    codice:
    import java.util.Scanner;
    
    public class clienti 
    {
    	public clienti(String CodiceFiscale, String Nome, String Cognome, String Indirizzo)
    	{
    		this.CodiceFiscale = CodiceFiscale;
    		this.Nome = Nome;
    		this.Cognome = Cognome;
    		this.Indirizzo = Indirizzo;
    	}
    	
    	public static clienti read(Scanner s)
    	{
    		if(!s.hasNextLine())
    			return null;
    					
    		String CodiceFiscale = s.nextLine();
    		String Nome = s.nextLine();
    		String Cognome = s.nextLine();
    		String Indirizzo = s.nextLine();	
    		
    		return new clienti(CodiceFiscale,Nome,Cognome,Indirizzo);
    	}
    	
    	public String getCf()
    	{
    		return this.CodiceFiscale;
    	}
    	
    	public String getName()
    	{
    		return this.Nome;
    	}
    	
    	public String getCognome()
    	{
    		return this.Cognome;
    	}
    	
    	public String getIndirizzo()
    	{
    		return this.Indirizzo;
    	}
    	public String toString()
    	{
    		return "Codice Fiscale: " + this.CodiceFiscale + "\nNome: " + this.Nome + "\nCognome: " + this.Cognome + "\nIndirizzo: " + this.Indirizzo;
    	}
    	
    	private String CodiceFiscale;
    	private String Nome;
    	private String Cognome;
    	private String Indirizzo;
    }
    • La classe mobile

    codice:
    import java.util.Scanner;
    
    public class Mobile 
    {
    	private String tipo;
    	private String quantita;
    	private String prezzo;
    	private String valore;
    
    
    	public Mobile(String tipo, String valore, String quantita, String prezzo)
    	{
    		this.tipo = tipo;
    		this.valore = valore;
    		this.quantita = quantita;
    		this.prezzo = prezzo;
    	}
    	
    	public static Mobile read(Scanner s)
    	{
    		if(!s.hasNextLine())
    			return null;
    					
    		String tipo = s.nextLine();
    		String valore = s.nextLine();
    		String quantita = s.nextLine();
    		String prezzo = s.nextLine();	
    		
    		return new Mobile(tipo,valore,quantita,prezzo);
    	}
    	
    	public String getTipo()
    	{
    		return this.tipo;
    	}
    	
    	public String getValore()
    	{
    		return this.valore;
    	}
    	public String getQuantita()
    	{
    		return this.quantita;
    	}
    	
    	public String getPrezzo()
    	{
    		return this.prezzo;
    	}
    	
    	public String toString()
    	{
    		return "Mobile: " + tipo + "\nTipo: " + valore + "\nQuantit�: " + quantita + "\nPrezzo: " + prezzo;
    	}
    
    
    }
    • La classe preventivi

    codice:
    import java.util.ArrayList;import java.util.Scanner;
    
    
    public class preventivi 
    {
    	private String PP;
    	private String data;
    	private String cf;
    	private String sconto;
    	private ArrayList<Mobile> mobili;
    
    
    	public preventivi(String PP, String data, String cf, String sconto, ArrayList<Mobile> mobili)
    	{
    		this.PP = PP;
    		this.data = data;
    		this.cf = cf;
    		this.sconto = sconto;
    		this.mobili = mobili;
    	}
    	
    	public static preventivi read(Scanner s)
    	{
    		if(!s.hasNextLine())
    			return null;
    				
    		String PP = s.nextLine();
    		String data = s.nextLine();
    		String cf = s.nextLine();
    		String sconto = s.nextLine();
    		ArrayList mobili = new ArrayList<Mobile>();
    		mobili.add(Mobile.read(s));
    		
    		return new preventivi(PP, data,cf, sconto, mobili);
    	}
    	
    	public String toString()
    	{
    		return "Identificativo di preventivo: " + PP + "\nData: " + data + "\ncf: " + cf + "\nsconto: " + sconto + "\n" + mobili;
    	}
    
    
    }
    I problemi che sto riscontrando sono:
    1. Nel metodo "read" delle diverse classi non so che condizione mettere affinch� possa leggere tutti i mobili, tutti i clienti e tutti i preventivi che sono nei file perch� ora come ora ne legge solo uno per file
    2. Nell'ultimo punto dell'esercizio, per associare nomi e preventivi, mi conviene usare una mappa?

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Iniziamo a fissare alcune questioni su denominazioni e struttura nelle classi.

    Se una classe rappresenta 1 solo cliente, allora andrebbe chiamata Cliente .
    I nomi di classi dovrebbero essere composti da parola/e in maiuscolo e siccome rappresenta 1 entità, al singolare.

    Le variabili dovrebbero iniziare con la minuscola. Le variabili di istanza per convenzione si mettono all'inizio della classe, prima di costruttori e metodi.

    codice:
    public class Cliente {
        private String codiceFiscale;
        private String nome;
    .......

    Metodi tipo

    public static clienti read(Scanner s)

    in realtà sono un po' "dubbi". In teoria non dovrebbero stare lì.


    Non mettere \n in output (e nemmeno nella stringa dal toString), Il \n NON è in generale il "newline".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ok, ho corretto i cari errori di denominazione e struttura, ma per quanto riguarda la classe read, dovrei quindi inserirle dirattamete nella classe di test?

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da bennystefa Visualizza il messaggio
    Ok, ho corretto i cari errori di denominazione e struttura, ma per quanto riguarda la classe read, dovrei quindi inserirle dirattamete nella classe di test?
    Sarebbe più pulito avere una classe che si occupi della sola lettura (e in caso scrittura) su file. Io poi dichiarerei i metodi in questo modo :

    codice:
    public List <Cliente> leggiClienti (File file) { ... }
    
    public List <Preventivo> leggiPreventivi (File file) { ...}
    Ai metodi cioè tu passi l'oggetto File che contiene i dati, o volendo il path del file sotto forma di stringa. Poi all'interno leggeresti il file riga per riga, e man mano che trovi clienti (o preventivi nel secondo caso) li aggiungi a una lista, o ad un'altra struttura dati (non è da escludere l'utilizzo di mappe, visto che poi ti viene anche richiesto di eseguire delle ricerche, ma per ora io mi occuperei solo di leggere correttamente i dati e restituire una semplice ArrayList).

    Ci sono alcune cose da tenere in considerazione :

    - Visto che hai più di un oggetto per file devi occuparti tu di determinare quando inizia e finisce il singolo oggetto, oltre a dover leggere correttamente i campi.
    - Dovresti anche scegliere come gestire eventuali "errori" in fase di lettura. Io nella dichiarazione del metodo lancerei come minimo una IOException nel caso il file non sia presente.
    Ma il resto è tutto da vedere, immagina di avere letto correttamente 5 clienti e di trovare poi il resto del file "malformato". Cosa fai? Gestisci l'eccezione all'interno del metodo e popoli comunque la lista con i dati corretti? O magari blocchi in tronco l'esecuzione? O lanci fuori l'eccezione e sarà il chiamante a scegliere se interrompere l'esecuzione o magari richiedere un altro file?

    In generale non sono questioni così banali ...
    Ultima modifica di Ansharja; 02-02-2017 a 19:57

  5. #5
    capito, grazie mille per la risposta, mi concentrerò prima sulla struttura delle varie classi e poi comincerò a programmare

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.