Chiarimento classi

di il
46 risposte

46 Risposte - Pagina 3

  • Re: Chiarimento classi

    trixy ha scritto:


    Ma io non è che chido il codice del programma
    Non ti ho dato un codice completo (non ne avrei avuto nemmeno tempo ieri sera ..) ma una impalcatura/suggerimento utile per procedere in modo sicuramente buono e valido.
  • Re: Chiarimento classi

    Ho provato a fare la parte per inserire un articolo e per visualizzare il listino.
    import java.util.Scanner;
    
    public class ProgListino {
    	private static final int OPZIONE_AGGIUNTA = 1;
    	private static final int OPZIONE_ELIMINA = 2;
    	private static final int OPZIONE_VISUALIZZA = 3;
    	private static final int OPZIONE_USCITA = 4;
    	private Scanner stdIn = new Scanner (System.in);
    	private Listino listino = new Listino();
    	public static void main(String[] args) {
    		ProgListino progListino = new ProgListino();
    		progListino.gestione();
    		
    	}
    	private void gestione()
    	{
    		int opzione;
    		do {
    			opzione = leggiOpzioneMenu();
    			switch (opzione) {
    			case OPZIONE_AGGIUNTA: aggiuntaArticolo(); break;
    			//case OPZIONE_ELIMINA: eliminaArticolo(); break;
    			case OPZIONE_VISUALIZZA: visualizza(); break;
    			case OPZIONE_USCITA: System.exit(0);}
    			}while (opzione !=OPZIONE_USCITA);		
    		}
    		private int leggiOpzioneMenu()
    		{
    			int opzione;
    			Menu menu = new Menu();
    			menu.mostraMenu();
    			System.out.print("Cosa vuoi fare? ");
    			opzione=stdIn.nextInt();
    			return opzione;
    		}	
    		private Articolo aggiuntaArticolo()
    		{
    			String nome=null,descr=null;
    			float prezzo=0;
    			ProgListino progListino = new ProgListino();
    			progListino.leggiNome(nome);
    			progListino.leggiDescr(descr);
    			progListino.leggiPrezzo(prezzo);
    			Articolo a = new Articolo();
    			listino.aggiungiArticolo(a);
    			return a;			
    	    }
    		private String leggiNome(String nome)
    		{
    			System.out.print("Inserisci il nome:");
    		     nome=stdIn.nextLine();
    		     return nome;
    		}
    		private String leggiDescr(String descr)
    		{
    			System.out.print("Inserisci descrizione: ");
    			descr=stdIn.nextLine();
    			return descr;
    		}
    		private float leggiPrezzo(float prezzo)
    		{
    			System.out.print("Inserisci il prezzo: ");
    			prezzo=stdIn.nextFloat();
    			return prezzo;
    		}
    		private void visualizza()
    		{
    			listino.visualizza();
    		}
    
    }
    
    Ora chiedo: la sezione private Articolo aggiungiArticolo perchè trovo errore se non dichiaro quelle 3 variabili? Come faccio a passare quelle 3 variabili senza inizializzarle? In questomodo è normale che mi dàcome risultato sempre null?
    A furia di andare dietro le correzioni di Eclipse non ci sto capendo niente,le faccio a caso....non mi sembra affato un buon modo....
  • Re: Chiarimento classi

    trixy ha scritto:


    Ho provato a fare la parte per inserire un articolo e per visualizzare il listino.
    Purtroppo ci sono diverse cose che non vanno:

    1) In gestione() puoi tranquillamente evitare il case OPZIONE_USCITA. Si può benissimo fare così:
                case OPZIONE_VISUALIZZA: visualizza(); break;
                }
            } while (opzione != OPZIONE_USCITA);
            
            System.exit(0);
        }
    E anzi, il System.exit(0) si può anche omettere. Se termina il do-while, termina il gestione(). E se termina gestione() termina il main quindi la applicazione si chiude naturalmente.

    2) In leggiOpzioneMenu() andare ad usare un'altra classe solo per mostrare il menù mi pare un po' eccessivo.

    3) aggiuntaArticolo() è proprio sbagliato.

    Innanzitutto NON serve fare new ProgListino(). aggiuntaArticolo() è un metodo di ISTANZA, puoi accedere a tutti i campi/metodi di istanza. Quindi NON hai bisogno di un nuovo oggetto ProgListino per poter invocare i leggiNome ecc...

    E poi leggi nome restituisce un String ma tu da aggiuntaArticolo NON stai usando questo valore di ritorno. Hai invocato leggiNome ecc.. ma il valore restituito non lo usi/assegni in qualche modo.

    E comunque, te lo dico subito, stai mischiando l'uso di nextInt() con nextLine() di Scanner. E questo non va bene perché crea problemi (ne ho parlato molte volte sul forum, fai una ricerca).

    4) Fare metodi appositi per nome, descrizione, prezzo mi pare eccessivo. Nel mio esempio abbozzato vedi che avevo messo metodi più generali come leggiString/leggiInt/leggiFloat. Con queste 3 "primitive" di input potevi fare tutta la gestione comodamente.

    trixy ha scritto:


    A furia di andare dietro le correzioni di Eclipse non ci sto capendo niente,le faccio a caso....non mi sembra affato un buon modo....
    Infatti ... non è proprio un buon modo, non puoi andare "a casaccio" così. A parte quello che ti può suggerire/correggere Eclipse (che può portare a risultati giusti .. o sbagliati, Eclipse NON sa cosa vuoi ottenere), dovresti cercare di "ragionare" di più tu, conoscendo anche (possibilmente) bene le regole di Java.
  • Re: Chiarimento classi

    Innanzitutto NON serve fare new ProgListino(). aggiuntaArticolo() è un metodo di ISTANZA, puoi accedere a tutti i campi/metodi di istanza. Quindi NON hai bisogno di un nuovo oggetto ProgListino per poter invocare i leggiNome ecc...
    Peròse non faccio così me lo sottolinea e con i seguenti possibili errori mostrati in allegato. Il risultato è che seguendo una mia logica, con quella lista di erroiri capisco che non ho capito un tubo di JAVA.
    E poi leggi nome restituisce un String ma tu da aggiuntaArticolo NON stai usando questo valore di ritorno. Hai invocato leggiNome ecc.. ma il valore restituito non lo usi/assegni in qualche modo.
    Per far ciò ho cercato di eseguire gli esercizi proposti sul libro riguardo all'inserimento di elementi in un vettore. solo che io lo voglio modificare facendo in modo che gli elementi li immetta io da tastiera e non da parametri passati direttamente nella classe. Così non ha senso secondo me. decvo creare un programma che si interfaccia con l'utente,altrimenti mi faccio una semplice lista in word e faccio prima.
    Fare metodi appositi per nome, descrizione, prezzo mi pare eccessivo. Nel mio esempio abbozzato vedi che avevo messo metodi più generali come leggiString/leggiInt/leggiFloat. Con queste 3 "primitive" di input potevi fare tutta la gestione comodamente.
    Che cosa significa?Che non serve la classeArticolo?
    Allegati:
    22615_b169302d2a9f2a0d67a286fb8b4cc7da.jpg
    22615_b169302d2a9f2a0d67a286fb8b4cc7da.jpg
  • Re: Chiarimento classi

    In pratica, quello che a me viene complicato seguendo i vostri consigli,è quello di creare l'i/o verso l'utente nella classe ProgListino.
    Studiando dal mio libro, ho imparato a mettere le richieste verso l'utente nella classe articolo. facendo come dite voi mi confondo e non ne esco fuori.
  • Re: Chiarimento classi

    trixy ha scritto:


    Peròse non faccio così me lo sottolinea e con i seguenti possibili errori mostrati in allegato. Il risultato è che seguendo una mia logica, con quella lista di erroiri capisco che non ho capito un tubo di JAVA.
    Io ti ho detto una cosa abbastanza chiara: lì in aggiuntaArticolo() NON ti serve creare un nuovo oggetto ProgListino. leggiNome/leggiDescr ecc. sono metodi di ISTANZA e li puoi invocare tranquillamente da aggiuntaArticolo (che è anch'esso un metodo di istanza).
    Per far ciò ho cercato di eseguire gli esercizi proposti sul libro riguardo all'inserimento di elementi in un vettore. solo che io lo voglio modificare facendo in modo che gli elementi li immetta io da tastiera e non da parametri passati direttamente nella classe. Così non ha senso secondo me. decvo creare un programma che si interfaccia con l'utente,altrimenti mi faccio una semplice lista in word e faccio prima.
    Non ha senso cosa??

    Il tuo leggiNome ha la forma:

    private String leggiNome(String nome)

    Nota che il parametro String nome NON ti serve. Se assegni qualcosa al parametro, al chiamante NON cambia nulla. Questo è un concetto base di Java!

    Quindi leggiNome al massimo dovrebbe essere:

    private String leggiNome()

    Che RESTITUISCE la stringa. E questa stringa la DEVI usare in qualche modo:

    Se fai solo

    leggiNome();

    non serve a nulla. Semmai:

    String nome = leggiNome();
    // ...
    Articolo a = new Articolo();
    a.setNome(nome);
    Che cosa significa?Che non serve la classeArticolo?
    Certo che SERVE la classe Articolo !!
  • Re: Chiarimento classi

    Avevo capito tutt'altro....continuo a ragionare con quello che ho aprreso dal libro.
  • Re: Chiarimento classi

    Sistemato tutto tranne la visualizzazione:non esce il nome ma soltanto la colonna delladescrizione e del prezzo
  • Re: Chiarimento classi

    trixy ha scritto:


    Sistemato tutto tranne la visualizzazione:non esce il nome ma soltanto la colonna delladescrizione e del prezzo
    Se hai fatto un mix di nextInt() e nextLine() te lo ripeto, causa problemi.
  • Re: Chiarimento classi

    Ho aggiunto un stdIn.nextLine() a vuoto.
  • Re: Chiarimento classi

    trixy ha scritto:


    Ho aggiunto un stdIn.nextLine() a vuoto.
    Ok, allora il problema è altro. Se vuoi riposta il codice che vediamo. Non saprei che altro dire.
  • Re: Chiarimento classi

    import java.util.Scanner;
    
    public class ProgListino {
    	private static final int OPZIONE_AGGIUNTA = 1;
    	private static final int OPZIONE_ELIMINA = 2;
    	private static final int OPZIONE_VISUALIZZA = 3;
    	private static final int OPZIONE_USCITA = 4;
    	private Scanner stdIn = new Scanner (System.in);
    	private Listino listino = new Listino();
    	public static void main(String[] args) {
    		ProgListino progListino = new ProgListino();
    		progListino.gestione();
    		
    	}
    	private void gestione()
    	{
    		int opzione;
    		do {
    			opzione = leggiOpzioneMenu();
    			switch (opzione) {
    			case OPZIONE_AGGIUNTA: aggiuntaArticolo(); break;
    			//case OPZIONE_ELIMINA: eliminaArticolo(); break;
    			case OPZIONE_VISUALIZZA: visualizza(); break;}
    			}while (opzione !=OPZIONE_USCITA);		
    		}
    		private void mostraMenu()
    		 {
    		 System.out.println();
    		 System.out.println("1\tAggiungi articolo: ");
    		 System.out.println("2\tElimina articolo: ");
    		 System.out.println("3\tVisualizza listino: ");
    		 System.out.println("4\tEsci ");
    		 
    		 }
    		private int leggiOpzioneMenu()
    		{	
    			mostraMenu();
    			int opzione;
    			System.out.print("Cosa vuoi fare? ");
    			opzione=stdIn.nextInt();
    			return opzione;
    		}	
    		private void aggiuntaArticolo()
    		{
    			Articolo a = new Articolo();
    			String nome = leggiNome();
    			a.setNome(nome);
    			String descr = leggiDescr();
    			a.setDescrizione(descr);
    			float prezzo = leggiPrezzo();
    			a.setPrezzo(prezzo);
    			listino.aggiungiArticolo(a);
    	    }
    		private String leggiNome()
    		{
    			System.out.print("Inserisci il nome:");
    		     String nome=stdIn.nextLine();
    		     stdIn.nextLine();
    		     return nome;
    		}
    		private String leggiDescr()
    		{
    			System.out.print("\nInserisci descrizione: ");
    			String descr=stdIn.nextLine();
    			return descr;
    		}
    		private float leggiPrezzo()
    		{
    			System.out.print("Inserisci il prezzo: ");
    			float prezzo=stdIn.nextFloat();
    			return prezzo;
    		}
    		private void visualizza()
    		{
    			listino.visualizza();
    		}
    
    }
    
    import java.util.Vector;
    import java.util.Scanner;
    
    class Listino 
     {
    	//Scanner scanner = new Scanner (System.in);
    	 private Vector lista;
    	 
    	 public Listino()
    	 {
    		 lista  = new Vector(1,1);
    	 }
    	 public void aggiungiArticolo(Articolo a)
    	 {
    		 lista.addElement(a);
    	 }
    	 public void eliminaArticolo(int indice)
    	 {
    		// System.out.print("\nArticolo da eliminare: ");
    		 //indice=scanner.nextInt();
    		 lista.removeElementAt(indice);
    		 System.out.print("Eliminazione effettuata con successo");
    	 }
    	 public void visualizza()
    	 {
    		 Articolo a;
    		 System.out.println("\t\t\t*** Listino ***");
    		 for (int i=0; i<lista.size(); i++)
    		 {
    			 a=(Articolo) lista.elementAt(i);
    			 a.stampa();
    		 }
    	 }
    }
    
    class Articolo 
     {
    	 private String nome;
    	 private String descrizione;
    	 private float prezzo;
    	 public void setNome(String nome)
    	 {
    		 this.nome=nome;
    	 }
    	 public void setDescrizione(String descrizione)
    	 {
    		 this.descrizione=descrizione;
    	 }
    	 public void setPrezzo(float prezzo)
    	 {
    		 this.prezzo=prezzo;
    	 }
    	 public void stampa()
    	 {
    		System.out.printf("%s %-15s %15f %n",nome,descrizione,prezzo); 
    	 }
    }
    
  • Re: Chiarimento classi

    trixy ha scritto:


    Ho aggiunto un stdIn.nextLine() a vuoto.
    Ho visto il codice .... era come pensavo
    Il nextLine() "a vuoto" va messo appena DOPO nextInt ... non dopo un nextLine (e anche dopo nextFloat).
  • Re: Chiarimento classi

    import java.util.Scanner;
    
    public class ProgListino {
       private static final int OPZIONE_AGGIUNTA = 1;
       private static final int OPZIONE_ELIMINA = 2;
       private static final int OPZIONE_VISUALIZZA = 3;
       private static final int OPZIONE_USCITA = 4;
       private Scanner stdIn = new Scanner (System.in);
       private Listino listino = new Listino();
       public static void main(String[] args) {
          ProgListino progListino = new ProgListino();
          progListino.gestione();
          
       }
       private void gestione()
       {
          int opzione;
          do {
             opzione = leggiOpzioneMenu();
             switch (opzione) {
             case OPZIONE_AGGIUNTA: aggiuntaArticolo(); break;
             //case OPZIONE_ELIMINA: eliminaArticolo(); break;
             case OPZIONE_VISUALIZZA: visualizza(); break;}
             }while (opzione !=OPZIONE_USCITA);      
          }
          private void mostraMenu()
           {
           System.out.println();
           System.out.println("1\tAggiungi articolo: ");
           System.out.println("2\tElimina articolo: ");
           System.out.println("3\tVisualizza listino: ");
           System.out.println("4\tEsci ");
          
           }
          private int leggiOpzioneMenu()
          {   
             mostraMenu();
             int opzione;
             System.out.print("Cosa vuoi fare? ");
             opzione=stdIn.nextInt();
             return opzione;
          }   
          private void aggiuntaArticolo()
          {
             Articolo a = new Articolo();
             String nome = leggiNome();
             a.setNome(nome);
             String descr = leggiDescr();
             a.setDescrizione(descr);
             float prezzo = leggiPrezzo();
             a.setPrezzo(prezzo);
             listino.aggiungiArticolo(a);
           }
          private String leggiNome()
          {
             System.out.print("Inserisci il nome:");
               String nome=stdIn.nextLine();
               
               return nome;
          }
          private String leggiDescr()
          {
             System.out.print("\nInserisci descrizione: ");
             String descr=stdIn.nextLine();
             return descr;
          }
          private float leggiPrezzo()
          {
             System.out.print("Inserisci il prezzo: ");
             float prezzo=stdIn.nextFloat();
             stdIn.nextLine();
             return prezzo;
          }
          private void visualizza()
          {
             listino.visualizza();
          }
    
    }
    
    Ho fatto così ed il risultato è il seguente:

    1 Aggiungi articolo:
    2 Elimina articolo:
    3 Visualizza listino:
    4 Esci
    Cosa vuoi fare? 1
    Inserisci il nome:
    Inserisci descrizione:
  • Re: Chiarimento classi

    trixy ha scritto:


    Ho fatto così
    Il nextLine() "a vuoto":
    - va messo dopo nextInt()/nextFloat()/ecc..
    - NON va messo dopo nextLine()

    Ti è chiaro il motivo?
Devi accedere o registrarti per scrivere nel forum
46 risposte