Aiutino per richiamare metodi di altre classi?

di il
40 risposte

40 Risposte - Pagina 2

  • Re: Aiutino per richiamare metodi di altre classi?

    xXNicolaXx ha scritto:


    Non capisco una cosa però..
    quando nella classe Registrazione istanzio un nuovo oggetto cosi:
    Passeggero p = new Passeggero();
    devo passare dei valori dentro le parentesi? Perchè ho provato qualsiasi cosa ma da sempre errore..quindi presumo debba lasciare vuoto.
    Questo dipende da come hai definito il costruttore in Passeggero... Se non ne hai scritto alcuno o ne hai previsto uno che non riceve argomenti in ingresso quello che hai scritto qui sopra è ok (anche se dicevamo che non è molto sensato costruire un Passeggero con valori di default).

    Ma se la classe Passeggero è come l'avevi lasciata, con un solo costruttore che riceve in ingresso due strighe, quel new Passeggero() ti dovrebbe dare un errore in compilazione, perché non esistono più a quel punto costruttori che non ricevono parametri.
    Mi pare molto strano che ti dia errore se provi a passare le due stringhe nome e cognome, in caso posta tutto il codice perché avrai fatto qualche errore.

    xXNicolaXx ha scritto:


    Poi...ho provato a fare l'input in due modi:
    primo modo:
    System.out.println("Benvenuto! Inserisca il suo nome : ");
        String nome = tastiera.nextLine();
        System.out.println("Il nome inserito è " + nome);
        
        
        System.out.println("Inserisca il suo cognome : ");
        String cognome = tastiera.nextLine();
        System.out.println("Il cognome inserito è " + cognome);
        
        p.toString();
    In questo modo mi stampa subito dopo il nome e il cognome che digito, ma quando poi richiamo il metodo toString, non compare niente a video
    Il metodo toString l'ho fatto cosi:
    @Override
    public String toString(){
            return "Passeggero : " + nome + " " + cognome;
        }
    Questo va in gran parte bene, solo che è proprio qui, dopo aver letto nome e cognome da scanner, che devi istanziare Passeggero passando nome e cognome appena letti.
    Ok anche il metodo toString(), se vuoi puoi aggiungere anche il numero, fai tu. Quando fai p.toString() stai solo richiamando il metodo che restituisce la tua stringa formata, ma non compare niente a video perché non la stai stampando (e non la stai neanche assegnando a nessuna variabile, quindi la chiamata scritta così è inutile).
    Ti basta mettere un System.out.print(p.toString()), o meglio solo System.out.print(p), visto che è proprio questa una delle grandi comodità di ridefinire toString() : i metodi che stampano a video, su file, o altri in determinati contesti vanno a prendersi in automatico il toString, non devi farlo tu esplicitamente.

    xXNicolaXx ha scritto:


    Se faccio cosi:
    System.out.println("Benvenuto! Inserisca il suo nome : ");
        String nome = tastiera.nextLine();
        System.out.println("Il nome inserito è " + nome);
        
        
        System.out.println("Inserisca il suo cognome : ");
        String cognome = tastiera.nextLine();
        System.out.println("Il cognome inserito è " + cognome);
        
        p.stampaPasseggero()
    dove stampaPasseggero è uguale a come l'ho scritto nel messaggio precedente, allora dopo aver inserito nome e cognome, mi stampa:
    Nome : null Cognome : null Numero : 0
    La classe passeggero è giusta? devo lavorare solo su Registrazione e capire li dove sbaglio?
    Questa parte va bene, il metodo toString rimpiazzerà appunto stampaPasseggero(). La classe Passeggero andava bene con l'aggiunta del toString(), non capisco appunto se hai rimosso il costruttore con le stringhe in ingresso, perché questo stampaPasseggero() è chiaro: nome e cognome sono ancora null, come se appunto non venissero istanziate dentro il costruttore (che è quello che succederebbe se tu avessi solo il costruttore di default di java) ... Se usi il costruttore con nome e cognome come avevi fatto prima, una volta creato il Passeggero funzionerà tutto e stampandolo a video vedrai i valori impostati correttamente.

    In caso di errori però posta il codice completo, che altrimenti è dura ...
  • Re: Aiutino per richiamare metodi di altre classi?

    Mi pare molto strano che ti dia errore se provi a passare le due stringhe nome e cognome, in caso posta tutto il codice perché avrai fatto qualche errore.
    Ti ho anticipato di nuovo e poco prima che tu inviassi il messaggio, io ne avevo scritto un altro segnalandoti l'edit. Effettivamente era colpa mia. Sbagliavo istanziando l'oggetto prima del metodo e non dentro..per quello quando scrivevo nome e cognome nelle parentesi diceva che non le trovava.
    Ora ho fatto come hai detto tu e anche il toString funziona! Finalmente, dopo una giornata intera
    Ti posto il codice e poi ti faccio ancora qualche domanda.
    ps. non so se va bene il codice che ho scritto per far stampare numero..nel caso puoi correggerlo? perchè altrimenti mi sa che ci metto un altra giornata per capirlo (in teoria stampa giusto..dico in teoria perchè poi non so se aggiungendo gli altri nomi incrementi o rimanga a 0)
    La classe del main è identica, richiama semplicemente il metodo Registra() di Registrazione, quindi non la metto.
    Classe Registazione:
    package aereoporto;
    
    import java.util.Scanner;
    
    public class Registrazione {
        Passeggero p = new Passeggero();
        Scanner tastiera = new Scanner(System.in);
    
        public void registra() {
            System.out.println("Benvenuto! Inserisca il suo nome : ");
            String nome = tastiera.nextLine();
            System.out.println("Il nome inserito è " + nome);
            System.out.println("Inserisca il suo cognome : ");
            String cognome = tastiera.nextLine();
            System.out.println("Il cognome inserito è " + cognome);
            System.out.println("Le è stato assegnato il numero " + p.getNumero());
            Passeggero p = new Passeggero(nome, cognome);
    
            System.out.println(p);
        }
    
    }
    
    Classe Passeggero.
    
    package aereoporto;
    
    public class Passeggero {
    
        private String nome;
        private String cognome;
        private int numero;
        private static int numeroPasseggeri = 0;
    
        public Passeggero(String nome, String cognome) {
            this.nome = nome;
            this.cognome = cognome;
            this.numero = numeroPasseggeri;
            numeroPasseggeri++;
    
        }
    
        Passeggero() {
    
        }
    
        public String getNome() {
            return nome;
        }
    
        public String getCognome() {
            return cognome;
        }
    
        public int getNumero() {
            return numero;
        }
    
        @Override
        public String toString() {
            return "Passeggero : " + nome + " " + cognome + " Numero : " + numero;
        }
    
    }
    
    Volevo capire alcune cose..
    perchè si usa l'override con il metodo toString() se effettivamente non c'è nessun metodo con lo stesso nome? Ho capito male io ho l'override si usa appunto quando ci sono due metodi con lo stesso nome?
    Poi..se adesso volessi fare il ciclo che mi fa inserire ad esempio max 10 utenti(facciamo finta che il max di utenti registrabili sia 10)...impostato come l'avevo messo nel primo post della discussione, quello che era scritto malissimo, ma in sostanza doveva permettere di fare:
    inserimento nome
    inserimento cognome
    assegnazione automatica del numero all utente(il primo utente riceverà il numero 1, il secondo il numero 2 e così via)
    Richiesta di registrare un altro utente
    Nel caso la risposta non sia Si, nuova richiesta di stampare l'elenco delle persone registrate con il loro nome, cognome e numero
    nel caso la risposta sia no, il programma termina
    Speriamo che la stampa del numero l'ho fatta giusta almeno possiamo proseguire
  • Re: Aiutino per richiamare metodi di altre classi?

    xXNicolaXx ha scritto:


    [...]
    Ti posto il codice e poi ti faccio ancora qualche domanda.
    ps. non so se va bene il codice che ho scritto per far stampare numero..nel caso puoi correggerlo? perchè altrimenti mi sa che ci metto un altra giornata per capirlo (in teoria stampa giusto..dico in teoria perchè poi non so se aggiungendo gli altri nomi incrementi o rimanga a 0)
    La classe del main è identica, richiama semplicemente il metodo Registra() di Registrazione, quindi non la metto.
    Classe Registazione:
    package aereoporto;
    
    import java.util.Scanner;
    
    public class Registrazione {
        Passeggero p = new Passeggero();
        Scanner tastiera = new Scanner(System.in);
    
        public void registra() {
            System.out.println("Benvenuto! Inserisca il suo nome : ");
            String nome = tastiera.nextLine();
            System.out.println("Il nome inserito è " + nome);
            System.out.println("Inserisca il suo cognome : ");
            String cognome = tastiera.nextLine();
            System.out.println("Il cognome inserito è " + cognome);
            System.out.println("Le è stato assegnato il numero " + p.getNumero());
            Passeggero p = new Passeggero(nome, cognome);
    
            System.out.println(p);
        }
    
    }
    
    Classe Passeggero.
    
    package aereoporto;
    
    public class Passeggero {
    
        private String nome;
        private String cognome;
        private int numero;
        private static int numeroPasseggeri = 0;
    
        public Passeggero(String nome, String cognome) {
            this.nome = nome;
            this.cognome = cognome;
            this.numero = numeroPasseggeri;
            numeroPasseggeri++;
    
        }
    
        Passeggero() {
    
        }
    
        public String getNome() {
            return nome;
        }
    
        public String getCognome() {
            return cognome;
        }
    
        public int getNumero() {
            return numero;
        }
    
        @Override
        public String toString() {
            return "Passeggero : " + nome + " " + cognome + " Numero : " + numero;
        }
    
    }
    
    Sì, l'aggiunta di numero nel toString() va benissimo, poi come formattare la stringa è una tua scelta, puoi mettere spazi, virgole, tutto quello che vuoi (magari andare a capo sarebbe un po' confusionario ma non è assolutamente proibito).

    Per il resto va tutto abbastanza bene, a parte quel Passeggero p = new Passeggero() che dichiari come campo di Registrazione, come detto non ti serve a nulla, e il costruttore Passeggero() vuoto nella classe Passeggero, ora che hai capito come passare nome e cognome non ne hai più bisogno.
    Volevo capire alcune cose..
    perchè si usa l'override con il metodo toString() se effettivamente non c'è nessun metodo con lo stesso nome? Ho capito male io ho l'override si usa appunto quando ci sono due metodi con lo stesso nome?
    L'override è la ridefinizione di un metodo che è stato ereditato. Tu non vedi nessun metodo toString() all'interno della classe, ma ci sarebbe anche se non l'avessi definito tu, perché in java ogni classe estende Object implicitamente e lo eredita di conseguenza. Anche se decidi di estendere un'altra classe, crei una catena di gerarchie dove però a monte ci sarà sempre Object. Quindi qualsiasi oggetto possiede il metodo toString() (o uno proprio o quello base ereditato da Object), come anche i metodi clone(), getClass(), hashCode() e altri.

    Puoi vedere l'elenco completo dei metodi di una classe dalla documentazione ufficiale : https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html (se clicchi in alto su Frames ti si apre la tendina con la lista completa delle classi).
    Poi..se adesso volessi fare il ciclo che mi fa inserire ad esempio max 10 utenti(facciamo finta che il max di utenti registrabili sia 10)...impostato come l'avevo messo nel primo post della discussione, quello che era scritto malissimo, ma in sostanza doveva permettere di fare:
    inserimento nome
    inserimento cognome
    assegnazione automatica del numero all utente(il primo utente riceverà il numero 1, il secondo il numero 2 e così via)
    Richiesta di registrare un altro utente
    Nel caso la risposta non sia Si, nuova richiesta di stampare l'elenco delle persone registrate con il loro nome, cognome e numero
    nel caso la risposta sia no, il programma termina
    Speriamo che la stampa del numero l'ho fatta giusta almeno possiamo proseguire
    Se è tutto chiaro puoi iniziare a pensare a come fare il ciclo. Ci sono moltissimi modi di procedere, io ad esempio farei così:

    - Il metodo che adesso hai chiamato registra() io lo pulirei dalle stampe a video inutili (come i controlli del nome inserito, numero etc. , lascia solo le stampe che dicono all'utente cosa fare e magari un messaggio di conferma una volta creato il passeggero, dove puoi lasciare il toString()) e lo ridenominerei inserisciNuovoPasseggero().
    - Dal main richiamerei un altro metodo in Registrazione, ad esempio gestisciOperazioni, in cui creo un ciclo infinito (ad esempio while(true){...).
    - All'interno del ciclo stamperei a video una specie di menù, dove magari assegni le varie operazioni a dei numeri.Le operazioni potrebbero essere ad esempio : (1) Inserisci nuovo utente, (2) stampa lista passeggeri, (3) modifica dati passeggero, (Altro) termina.
    Qui complico un po' le cose ma è per dare un'idea di come potrebbe evolversi il programma...
    - Leggo da tastiera la scelta dell'utente (attento che è sempre consigliabile leggere la stringa intera digitata e poi conventirla in numero (gestendo le possibili eccezioni), piuttosto che usare metodi come nextInt(), perché puoi avere problemi con il buffer).
    - Se la scelta è 1, richiamo il metodo inserisciNuovoPasseggero, e così via...
    - Se l'utente non scrive un'operazione permessa, termino il ciclo e di conseguenza esco dal programma.

    Prova a buttare giù qualcosa, hai un mondo di opportunità
  • Re: Aiutino per richiamare metodi di altre classi?

    Ok, provo a fare qualcosa e poi metto il codice..solo ancora qualche domanda...
    possono esistere due metodi toString nella stessa classe?
    Mettiamo che io creo due oggetti(questo che dirò non lo farò, è solo un esempio) uno che come adesso richiama i dati di un passeggero e l'altro che richiama i dati di un pilota di aerei(con però altri campi, tipo anni di lavoro, voli assegnati, giorni liberi)..se poi voglio stampare col metodo toString, in un primo caso deve stamparmi solo nome, cognome e numero(come ora). Se invece voglio stampare quello che contiene il costruttore di pilota? Si può fare un altro toString? Prima hai detto che quando lo stampo posso scrivere semplicemente System.out.println(nomeoggetto)..quindi senza nomeoggetto.toString(); nel caso si possono avere due toString, come fa a sapere a quale mi riferisco?
    Detto ciò, per fare il ciclo mi serve un vettore dove mettere ogni volta i nomi e i cognomi inseriti? O li "salva" da solo e quindi non li sovrascrive ogni volta? Perchè nel caso del vettore, avrei bisogno di una mano
    ps. si l'oggetto istanziato con il costruttore vuoto ho solo dimenticato di eliminarlo...però ho capito che non serve
  • Re: Aiutino per richiamare metodi di altre classi?

    Ho subito un problema..prima che continuo e magari perdo solo tempo per poi fare tutto sbagliato..chiedo subito.
    Ho fatto uno switch per la scelta dentro gestioneOperazioni(che sarebbe il menù). Se scelgo la prima opzione(ovvero di inserire un nuovo passeggero) e richiamo il metodo inserimentoPasseggero(il vecchio registra() ) mi stampa tutto di fila "inserisci nome" e "inserisci cognome", senza inserire prima il nome e poi il cognome dopo..cioè, compare tutto in una volta. Questo succede solo se lo richiamo dallo switch. Se invece dal main faccio partire direttamente il metodo inserimentoPasseggero(), allora funziona bene..a cosa è dovuto? Ecco il codice:
    package aereoporto;
    
    import java.util.Scanner;
    
    public class Registrazione {
        Passeggero p = new Passeggero();
        Scanner tastiera = new Scanner(System.in);
        private int scelta;
        
        public void gestisciOperazioni(){
           do{
            System.out.println("Seleziona una voce dal menù: ");
            System.out.println("1 Registra nuovo passeggero");
            System.out.println("2 Stampa lista passeggeri");
            System.out.println("3 Modifica dati passeggero");
            scelta = tastiera.nextInt();
            switch(scelta){
                case 1:
                inserimentoPasseggero();
                break;
                case 2:
                stampaPasseggeri();
                break;
                case 3:
                modificaPasseggero();
                break;
                default:
                System.out.println("Scelta non valida. Riprovare.");
                
              }
              }while(scelta != 1 || scelta != 2 || scelta != 3);
            
        }
        
        public void inserimentoPasseggero() {
            System.out.println("Benvenuto! Inserisca il suo nome : ");
            String nome = tastiera.nextLine();
            System.out.println("Inserisca il suo cognome : ");
            String cognome = tastiera.nextLine();
            System.out.println("Registrazione avvenuta con successo!");
            Passeggero p = new Passeggero(nome, cognome);
    
            
        }
        public void stampaPasseggeri(){
            System.out.println(p);
        }
        public void modificaPasseggero(){
        }
       
    }
                
    
    
    
    ps. non so nemmeno se il do-while va bene..perchè dopo che inserisco ad esempio il nome(con quel problema li che non mi fa mettere il cognome e quindi non lo considera ne un nome ne un cognome) mi torna di nuovo al metodo gestisciOperazioni()..pure se alla fine del metodo inserimentoPasseggero richiamo ad esempio il metodo stampaPasseggero(), dopo aver stampato il passeggero compare di nuovo il menù..non so se in questo caso è giusto perchè così uno sceglie all'infinito finchè non termina lui il programma..o se non dovrebbe accadere
  • Re: Aiutino per richiamare metodi di altre classi?

    Inizio da qui :

    xXNicolaXx ha scritto:


    [...]
    possono esistere due metodi toString nella stessa classe?

    Mettiamo che io creo due oggetti(questo che dirò non lo farò, è solo un esempio) uno che come adesso richiama i dati di un passeggero e l'altro che richiama i dati di un pilota di aerei(con però altri campi, tipo anni di lavoro, voli assegnati, giorni liberi)..se poi voglio stampare col metodo toString, in un primo caso deve stamparmi solo nome, cognome e numero(come ora). Se invece voglio stampare quello che contiene il costruttore di pilota? Si può fare un altro toString? Prima hai detto che quando lo stampo posso scrivere semplicemente System.out.println(nomeoggetto)..quindi senza nomeoggetto.toString(); nel caso si possono avere due toString, come fa a sapere a quale mi riferisco?
    Hai centrato il problema, se esistessero due toString() dichiarati alla stessa maniera, non si potrebbe sapere a quale ti riferisci. Vale per tutti i metodi: non possono esistere due metodi che hanno lo stesso nome e ricevono in ingresso lo stesso numero/tipo di parametri.
    Il tuo esempio con pilota non è molto chiaro, se tu crei una classe Pilota distinta da Passeggero (parli di altri campi) le tue classi sono diverse e quindi ognuna può ridefinire toString(). Quando ridefinisci un metodo esso deve essere dichiarato esattamente con la stessa sintassi, nel caso di toString() :
    
    public String toString()
    
    Guarda questo piccolo esempio, riusciresti a dire quali delle classi Test1, Test2, Test3, Test4 sono corrette prima di compilare il file Test.java? Forse c'è qualcosa che non ti aspetteresti :
    
    public class Test
    {
    	private class Test1 {
    		public void toString() {
    			
    		}
    	}
    	private class Test2 {
    		public String toString() {
    			return null;
    		}
    		public String toString() {
    			return "Another toString";
    		}
    	}
    	private class Test3 {
    		private String toString() {
    			return "Ciao";
    		}
    	}
    	private class Test4 {
    		public String toString() {
    			return "Pippo";
    		}
    		public String toString(Object object) {
    			return object.toString();
    		}
    		public String toString(int parametroInutile) {
    			return "5";
    		}
    	}
    }
    
    Detto ciò, per fare il ciclo mi serve un vettore dove mettere ogni volta i nomi e i cognomi inseriti? O li "salva" da solo e quindi non li sovrascrive ogni volta?
    Il vettore ti può servire indipendentemente dal ciclo. Ad ora il Passeggero che crei non viene salvato da nessuna parte, esiste internamente al metodo registra(), appena si esce dal metodo non lo puoi più recuperare. Quindi non viene "sovrascritto" dal nuovo passeggero, ogni volta che crei un nuovo passeggero con registra() ne avrai uno nuovo, ma poi l'oggetto verrà automaticamente eliminato dalla jvm (senza scendere nei dettagli, non li so nemmeno io), quando ad ora non lo sai, perché non viene utilizzato in nessun punto del codice.

    Quindi no, i passeggeri non vengono "salvati" da soli. Puoi assegnarli a delle variabili (ad esempio se avessi bisogno di soli due passeggeri un array sarebbe superfluo, tanto vale salvarsi in Registrazione due oggetti Passeggero e assegnare a quelle variabili i passeggeri creati), inserirli in un vettore (comincia da qui), in una lista, in una mappa etc.
    Se usi un array ha senso tenere in Registrazione un campo come :
    
    Passeggero[] passeggeri = new Passeggero[10];
    
    puoi istanziarlo già nella definizione, o prima di entrare nel ciclo di gestisciOperazioni() o altrove, non fa una gran differenza.
    Ma dovresti anche memorizzare da qualche parte l'indice del vettore al quale sei arrivato, in modo da incrementarlo all'interno di inserimentoPasseggero(), subito dopo l'assegnazione.
  • Re: Aiutino per richiamare metodi di altre classi?

    xXNicolaXx ha scritto:


    Ho subito un problema..prima che continuo e magari perdo solo tempo per poi fare tutto sbagliato..chiedo subito.
    Ho fatto uno switch per la scelta dentro gestioneOperazioni(che sarebbe il menù). Se scelgo la prima opzione(ovvero di inserire un nuovo passeggero) e richiamo il metodo inserimentoPasseggero(il vecchio registra() ) mi stampa tutto di fila "inserisci nome" e "inserisci cognome", senza inserire prima il nome e poi il cognome dopo..cioè, compare tutto in una volta. Questo succede solo se lo richiamo dallo switch. Se invece dal main faccio partire direttamente il metodo inserimentoPasseggero(), allora funziona bene..a cosa è dovuto?
    L'avevo scritto prima :
    - Leggo da tastiera la scelta dell'utente (attento che è sempre consigliabile leggere la stringa intera digitata e poi conventirla in numero (gestendo le possibili eccezioni), piuttosto che usare metodi come nextInt(), perché puoi avere problemi con il buffer)
    Se sostituisci quel nextInt() con nextLine(), il problema scompare, non ti saprei spiegare benissimo il problema con il buffer ora, se non sbaglio con nextInt() legge solo l'intero inserito, mentre il carattere di invio rimane nel buffer e da' problemi in seguito (c'erano altre discussioni in cui magari è spiegato meglio).
    Se usi nextLine() come ti consiglio hai due possibilità: o fai i confronti direttamente tra stringhe (mi pare che sia possibile ora fare anche gli switch con le stringhe, ma in generale quando confronti stringhe attento a non usare ==, ma equals()), oppure "parsi" la stringa in intero e poi fai lo switch come lo stai facendo adesso. Se fai il parsing (vedi ad esempio Integer.parseInt(String s) o Integer.valueOf(String s)) devi stare attento a inserire effettivamente dei numeri o catturare le possibili eccezioni che il parsing lancia (banalmente Integer.parseInt("Ciao") lancia una NumberFormatException, se non la gestisci ti va tutto a quel paese).
    ps. non so nemmeno se il do-while va bene..perchè dopo che inserisco ad esempio il nome(con quel problema li che non mi fa mettere il cognome e quindi non lo considera ne un nome ne un cognome) mi torna di nuovo al metodo gestisciOperazioni()..pure se alla fine del metodo inserimentoPasseggero richiamo ad esempio il metodo stampaPasseggero(), dopo aver stampato il passeggero compare di nuovo il menù..non so se in questo caso è giusto perchè così uno sceglie all'infinito finchè non termina lui il programma..o se non dovrebbe accadere
    Il do-while come costrutto va bene, puoi usare anche un semplice while in cui termini tu l'esecuzione quando necessario. Come hai scritto ora il costrutto non ha senso, perché scelta vale 0 all'inizio (quindi entri nel ciclo), poi scelta sarà sempre diverso da 1 o diverso da 2 o diverso da 3 (non può valere tutti i valori allo stesso tempo no ?) quindi la condizione restituita dal while è sempre true e non esci mai.
    Potresti scrivere nel while come condizioni che scelta sia uguale a uno dei tre numeri (1,2,3), quindi se l'utente continua a inserire un'operazione corretta cicla all'infinito, appena inserisce un numero diverso invece esci. Puoi anche inserire un comando per uscire o altro ancora.
  • Re: Aiutino per richiamare metodi di altre classi?

    Avevo inviato un messaggio ma sono da telefono e non so che ha combinato... alla fine non è comparso. Comunque adesso ho chiuso il pc..domani rispondo per bene a tutto quello che mi hai detto
    Leggo da tastiera la scelta dell'utente (attento che è sempre consigliabile leggere la stringa intera digitata e poi conventirla in numero (gestendo le possibili eccezioni), piuttosto che usare metodi come nextInt(), perché puoi avere problemi con il buffer)
    Si, questo punto l avevo letto ma non ero riuscito a decifrare ciò che dovevo fare
    Comunque come detto domani provo tutto e ti faccio sapere.
    Per il while hai ragione..non so perché ho cambiato tutti i !=1 || !=2 ecc in ==1 || ==2
    Avevo fatto giusto e poi ho cambiato.. sarà la stanchezza..vabbe, domani se hai voglia di aiutarmi continuiamo. Per ora grazie davvero tanto
  • Re: Aiutino per richiamare metodi di altre classi?

    Ciao, rieccomi qui a lavorare su quel programma...
    Allora, ho risistemato il while come mi hai detto tu e sostituendo il nextInt() con il nextLine(), e ora funziona bene
    Per il confronto tra le stringhe ho usato questo codice:
    while(scelta.equalsIgnoreCase("1") || scelta.equalsIgnoreCase("2") || scelta.equalsIgnoreCase("3"));
    Adesso per quanto riguarda il vettore non so proprio da dove partire..ho cercato un po' su internet ma non so proprio come fare. Un conto era partire direttamente da un vettore nella quale ogni elemento che scrivevo veniva subito messo li..ma se devo inserire delle variabili dentro a un vettore non so proprio come fare. Innanzitutto, questo vettore devo farlo nella classe Registrazione o nella classe Passeggero?
    Poi, ho bisogno di un costruttore?
    Ah, dimenticavo..va bene un semplice array o dovrei usare un arraylist?
    per quanto riguarda la domanda che mi avevi fatto su questo codice:
    public class Test
    {
       private class Test1 {
          public void toString() {
             
          }
       }
       private class Test2 {
          public String toString() {
             return null;
          }
          public String toString() {
             return "Another toString";
          }
       }
       private class Test3 {
          private String toString() {
             return "Ciao";
          }
       }
       private class Test4 {
          public String toString() {
             return "Pippo";
          }
          public String toString(Object object) {
             return object.toString();
          }
          public String toString(int parametroInutile) {
             return "5";
          }
       }
    }
    mi verrebbe da dire la 3, ma poi sono sicuro sia la 4 perchè è sempre quella più complicata quella giusta
    Edit 2:
    Ho provato con un array list...effettivamente mi salva i nomi e i cognomi e me li stampa..l'unica cosa è che vorrei evitare di vedere le parentesi [] nella stampa(ma mi sa che è una cosa degli arraylist. Altra cosa è che riesco a stampare ma solo se creo un metodo stampa interno a Registrazione. Perchè con il toString di Passeggero non riesco a collegarlo.
    Intanto ti posto il codice di Registrazione(Passeggero è rimasta invariata)
    package aereoporto;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Registrazione {
        Passeggero p = new Passeggero();
        Scanner tastiera = new Scanner(System.in);
        private String scelta;
        ArrayList v = new ArrayList(10);
        
        public void gestisciOperazioni(){
           do{ System.out.println("Seleziona una voce dal menù: ");
            System.out.println("1 Registra nuovo passeggero");
            System.out.println("2 Stampa lista passeggeri");
            System.out.println("3 Modifica dati passeggero");
            scelta = tastiera.nextLine();
            switch(scelta){
                case "1":
                inserimentoPasseggero();
                break;
                case "2":
                stampa();
                break;
                case "3":
                modificaPasseggero();
                break;
                default:
                System.out.println("Scelta non valida. Riprovare.");
                
              }}while(scelta.equalsIgnoreCase("1") || scelta.equalsIgnoreCase("2") || scelta.equalsIgnoreCase("3"));
            
        }
        
        public void inserimentoPasseggero() {
            System.out.println("Benvenuto! Inserisca il suo nome : ");
            String nome = tastiera.nextLine();
            v.add(nome);
            System.out.println("Inserisca il suo cognome : ");
            String cognome = tastiera.nextLine();
            v.add(cognome);
            System.out.println("Registrazione avvenuta con successo!");
            Passeggero p = new Passeggero(nome, cognome);
            gestisciOperazioni();
        }
        public void stampaPasseggeri(){
            System.out.println(p);
            gestisciOperazioni();
        }
        public void stampa(){
            System.out.println(v);
        }
        public void modificaPasseggero(){
        }
       
    }
           
    in realtà credo si possa migliorare e creare un secondo arraylist solo per i cognomi..in modo che poi nella stampa posso fare ad esempio:
    
    System.out.println("Nome : " + v + "Cognome : " + c);
    
    dove v è quello per i nomi e c quello per i cognomi...però prima voglio capire se è corretto
    Poi si si riesce a fare con gli array per evitare di avere le parentesi quadre nella stampa sarebbe meglio...esisto con per gli arraylist dei metodi "add" che quindi inseriscono nel vettore una determinata variabile?

    edit 3:
    ho provato con un vettore..però me lo stampa tutto null, evidentemente sbaglio nell'inserimento della variabile all'interno
    
    package aereoporto;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Registrazione {
        Passeggero p = new Passeggero();
        Scanner tastiera = new Scanner(System.in);
        private String scelta;
        ArrayList v = new ArrayList(10);
        String[] vett = new String[10];
        
        public void gestisciOperazioni(){
           do{ System.out.println("Seleziona una voce dal menù: ");
            System.out.println("1 Registra nuovo passeggero");
            System.out.println("2 Stampa lista passeggeri");
            System.out.println("3 Modifica dati passeggero");
            scelta = tastiera.nextLine();
            switch(scelta){
                case "1":
                inserimentoPasseggero();
                break;
                case "2":
                stampa();
                break;
                case "3":
                modificaPasseggero();
                break;
                default:
                System.out.println("Scelta non valida. Riprovare.");
                
              }}while(scelta.equalsIgnoreCase("1") || scelta.equalsIgnoreCase("2") || scelta.equalsIgnoreCase("3"));
            
        }
        
        public void inserimentoPasseggero() {
            System.out.println("Benvenuto! Inserisca il suo nome : ");
            String nome = tastiera.nextLine();
            for(int i=0; i<vett.length; i++){
            nome = vett[i];
            }
            System.out.println("Inserisca il suo cognome : ");
            String cognome = tastiera.nextLine();
            v.add(cognome);
            System.out.println("Registrazione avvenuta con successo!");
            Passeggero p = new Passeggero(nome, cognome);
            gestisciOperazioni();
        }
        public void stampaPasseggeri(){
            System.out.println(p);
            gestisciOperazioni();
        }
        public void stampa(){
            for(int i=0; i<vett.length; i++){
            System.out.println(vett[i]);
            }
        }
        public void modificaPasseggero(){
        }
       
    }
    
  • Re: Aiutino per richiamare metodi di altre classi?

    xXNicolaXx ha scritto:


    [...]
    Per il confronto tra le stringhe ho usato questo codice:
    while(scelta.equalsIgnoreCase("1") || scelta.equalsIgnoreCase("2") || scelta.equalsIgnoreCase("3"));
    Il confronto è corretto, anche se non hai bisogno di equalsIgnoreCase() in questo caso, equals() va benissimo (dovresti riuscire tu a dirmi il perché, altrimenti leggi un attimo la documentazione di String).
    Se posso consigliartelo, prova anche l'altro metodo, cioè convertire la stringa in numero: prima o poi dovrai essere in grado di farlo (gestire una possibile eccezione è un po' più avanzata come cosa, per ora puoi fare finta che non succeda, o se sei particolarmente curioso puoi già iniziare a dare un'occhiata ai blocchi try-catch-finally ).

    xXNicolaXx ha scritto:


    Adesso per quanto riguarda il vettore non so proprio da dove partire..ho cercato un po' su internet ma non so proprio come fare. Un conto era partire direttamente da un vettore nella quale ogni elemento che scrivevo veniva subito messo li..ma se devo inserire delle variabili dentro a un vettore non so proprio come fare. Innanzitutto, questo vettore devo farlo nella classe Registrazione o nella classe Passeggero?
    Poi, ho bisogno di un costruttore?
    Questo però è importante capirlo. Non dovresti assolutamente matterlo nella classe Passeggero, quale sarebbe la logica di avere una serie di passeggeri legati ad ogni singolo Passeggero ?
    Nella classe Registrazione va benissimo, per ora hai un'unica istanza di Registrazione e lavori con un solo vettore, ma la logica è che se tu avessi una classe come Volo, di cui creerai più istanze ovviamente, vorrai che ogni Volo abbia il proprio insieme di Passeggeri, quindi il vettore di Passeggeri va inserito in Volo come campo di istanza (non statico).
    Non hai bisogno di istanziare il vettore all'interno di un costruttore, va benissimo farlo perché ti permette ad esempio di crearlo con una dimensione che il costruttore riceve in ingresso, ad esempio :
    
    public class Volo
    {
    	private Passeggero[] passeggeri;
    	public Volo (int massimoPasseggeri)  {
    		passeggeri = new Passeggero[massimoPasseggeri];
    	}
    }
    
    Ma puoi benissimo istanziarlo già nella definizione se hai una dimensione massima fissa (in realtà puoi istanziarlo in qualunque metodo, basta che tu lo faccia prima di provare a inserire/modificare valori all'interno).

    Devi cominciare a prendere confidenza con gli array, non puoi proprio andare avanti senza saperli usare, o meglio puoi ma avresti un buco tremendo...
    Una volta che il vettore è creato puoi manipolarlo come vuoi, devi sapere come prendere gli elementi all'interno (es. Passeggero secondo = passeggeri[1]), settarli (passeggeri[6] = new Passeggero("Mario", "Rossi")), scambiarli (tipicamente si usa una variabile temporanea, si legge il primo valore e lo si copia nella variabile temporanea, si inserisce al posto del primo il secondo e poi nel secondo si ricopia il valore della variabile temporanea).
    Magari queste sono operazioni che hai già fatto in un singolo ciclo, ma devi sapere come farle da qualsiasi metodo/ parte del codice, cercati qualche esercizio online...

    xXNicolaXx ha scritto:


    Ah, dimenticavo..va bene un semplice array o dovrei usare un arraylist?
    Questo l'ho in parte già detto. Le liste vanno benissimo, e dovrai imparare a usare anche quelle. Ti offrono molte funzionalità e per ora ti eviterebbero anche di preoccuparti dell'indice, perché per aggiungere gli elementi basta un add() (anche se puoi richiamarlo con un parametro che specifichi la posizione), e si espandono in automatico, quindi è meno probabile avere una ArrayIndexOutOfBoundsException.
    Ma usarle senza aver capito come funzionano gli array nasconde solo il problema, quindi usa prima gli array

    xXNicolaXx ha scritto:


    per quanto riguarda la domanda che mi avevi fatto su questo codice:
    public class Test
    {
       private class Test1 {
          public void toString() {
             
          }
       }
       private class Test2 {
          public String toString() {
             return null;
          }
          public String toString() {
             return "Another toString";
          }
       }
       private class Test3 {
          private String toString() {
             return "Ciao";
          }
       }
       private class Test4 {
          public String toString() {
             return "Pippo";
          }
          public String toString(Object object) {
             return object.toString();
          }
          public String toString(int parametroInutile) {
             return "5";
          }
       }
    }
    mi verrebbe da dire la 3, ma poi sono sicuro sia la 4 perchè è sempre quella più complicata quella giusta
    In realtà non avevo specificato che ce n'era una sola di corretta Comunque è la 4, ma anche qui potresti provare a compilare, leggere gli errori, e capire da cosa sono causati.

    xXNicolaXx ha scritto:


    Edit 2:
    Ho provato con un array list...effettivamente mi salva i nomi e i cognomi e me li stampa..l'unica cosa è che vorrei evitare di vedere le parentesi [] nella stampa(ma mi sa che è una cosa degli arraylist. Altra cosa è che riesco a stampare ma solo se creo un metodo stampa interno a Registrazione. Perchè con il toString di Passeggero non riesco a collegarlo.
    Non dimenticarti il consiglio di lavorare anche con gli array! Comunque sì, una lista è comoda da stampare, perché basta passarla a uno dei metodi print() e in automatico ricevi la stampa di tutti gli elementi all'interno (che si basa sul toString(), quindi se non l'avessi ridefinito riceveresti una serie di Passeggero@47238473 etc.), separati da virgola e spazio e compresi tra due parentesi quadre.
    Questo dipende da come la lista ridefinisce toString(), non puoi farci nulla, ma nulla ti impedisce (anzi fallo!!) di ciclare sugli argomenti di una lista e stamparli uno a uno, decidendo tu come separarli (magari vuoi andare a capo per ogni elemento!).
    Tra l'altro per stampare un'array non puoi fare System.out.print(un_qualche_array), non ti stampa gli elementi all'interno, quindi ancora una volta dovresti stampare gli elementi manualmente, con un ciclo (anche se esistono metodi pronti che lo fanno per te).

    xXNicolaXx ha scritto:


    Intanto ti posto il codice di Registrazione(Passeggero è rimasta invariata) [...]
    Prima di tutto sistema i campi di istanza di Registrazione. Hai ancora quel Passeggero p come campo che non ti serve, toglilo. Dovresti aggiungere come campo l'array se usi quello, altrimenti la lista.
    Se usi la lista, intanto deve essere una lista di Passeggero, tu l'hai non l'hai parametrizzata, cosa poco saggia. E poi non devi aggiungere nome, cognome e altro alla lista!! Tu vuoi una lista di passeggeri, non una lista di nomi a caso ...
    Quindi in caso devi prima creare il nuovo passeggero (con nome e cognome), e poi aggiungelo alla lista (e non chiamarla v, i nomi dovrebbero essere autoesplicativi, quindi usa passeggeri, listaPasseggeri, elencoPasseggeri o simili).

    Anche scelta messo lì serve a poco, ti serve solo all'interno di gestisciOperazioni(), non in tutto il codice...

    xXNicolaXx ha scritto:


    in realtà credo si possa migliorare e creare un secondo arraylist solo per i cognomi..in modo che poi nella stampa posso fare ad esempio:
    
    System.out.println("Nome : " + v + "Cognome : " + c);
    
    dove v è quello per i nomi e c quello per i cognomi...però prima voglio capire se è corretto
    No, non ha alcun senso mantenere liste separate, torneresti come prima a lavorare in parallelo! Tu devi avere un contenitore di Passeggero (array e lista non sono le uniche possibilità), non avere le informazioni slegate e doverle ricomporre in qualche modo.

    xXNicolaXx ha scritto:


    Poi si si riesce a fare con gli array per evitare di avere le parentesi quadre nella stampa sarebbe meglio...esisto con per gli arraylist dei metodi "add" che quindi inseriscono nel vettore una determinata variabile?
    Spero si capisca da quanto detto sopra.

    xXNicolaXx ha scritto:


    edit 3:
    ho provato con un vettore..però me lo stampa tutto null, evidentemente sbaglio nell'inserimento della variabile all'interno
    
    [...]   
            String nome = tastiera.nextLine();
            for(int i=0; i<vett.length; i++){
            nome = vett[i];
            }
            [...]
          
    Allora dovresti aver capito che il vettore di Stringhe non va bene, deve essere un vettore di Passeggero. Per quanto riguarda l'inserimento ho isolato il codice sopra.
    Quel pezzo non è sensato, stai assegnando alla stringa nome (che all'inizio contiene il nome inserito da tastiera) il contenuto del vettore vett.
    Tu devi fare il contrario, e soprattutto non in un ciclo. Tu vuoi aggiungere un solo passeggero (dopo averlo creato, non devi aggiungere il nome al vettore), non devi fare un ciclo ma un'unica operazione di assegnamento.

    Questa è la parte più importante da capire, come fai a sapere in quale indice del vettore inserirai il nuovo passeggero creato? Devi avere una variabile che conti quanti passeggeri hai già inserito, e si incrementi all' inserimento di ogni passeggero (ma dovrai fermarti a un certo punto).

    Il metodo stampa() con il vettore invece è corretto, il ciclo lo devi fare proprio in quel modo.
  • Re: Aiutino per richiamare metodi di altre classi?

    Il confronto è corretto, anche se non hai bisogno di equalsIgnoreCase() in questo caso, equals() va benissimo (dovresti riuscire tu a dirmi il perché, altrimenti leggi un attimo la documentazione di String).
    Se posso consigliartelo, prova anche l'altro metodo, cioè convertire la stringa in numero: prima o poi dovrai essere in grado di farlo (gestire una possibile eccezione è un po' più avanzata come cosa, per ora puoi fare finta che non succeda, o se sei particolarmente curioso puoi già iniziare a dare un'occhiata ai blocchi try-catch-finally ).
    Si, la parte equalsIgnoreCase non serve perchè sto confrontando l'inserimento di un numero, che non può essere maiuscolo o minuscolo, giusto?
    Il try-catch l'ho visto..però non capisco cosa intendi per "convertire la stringa in un numero". Come si fa? Se non è fondamentale, questo lo vediamo dopo..mi sa che prima devo capire altre cose più importanti.
    
    public class Volo
    {
       private Passeggero[] passeggeri;
       public Volo (int massimoPasseggeri)  {
          passeggeri = new Passeggero[massimoPasseggeri];
       } 
       
    ecco..qua dobbiamo(e con dobbiamo intendo devo ) capire bene questo passaggio...quando tu scrivi
    
    private Passeggero[] passeggeri;
    
    Nella classe Volo stai creando un vettore che si chiama passeggeri(giusto?) che appartiene alla classe Passeggero OPPURE di tipo Passeggero(di tipo significa mica che appartiene alla classe con quel nome?). Facendo in questo modo, il vettore passeggeri, cos'ha di "speciale". Nel senso..è visibile all'interno della classe Passeggero? Prende gli attributi della classe? I parametri del costruttore? Su questa cosa sto impazzendo da giorni e non riesco a capirla nemmeno leggendo online...
    Prima di tutto sistema i campi di istanza di Registrazione. Hai ancora quel Passeggero p come campo che non ti serve, toglilo. Dovresti aggiungere come campo l'array se usi quello, altrimenti la lista.
    Se usi la lista, intanto deve essere una lista di Passeggero, tu l'hai non l'hai parametrizzata, cosa poco saggia. E poi non devi aggiungere nome, cognome e altro alla lista!! Tu vuoi una lista di passeggeri, non una lista di nomi a caso ...
    Quindi in caso devi prima creare il nuovo passeggero (con nome e cognome), e poi aggiungelo alla lista (e non chiamarla v, i nomi dovrebbero essere autoesplicativi, quindi usa passeggeri, listaPasseggeri, elencoPasseggeri o simili).
    Si scusa, mi sono dimenticato di nuovo di togliere quel Passeggero p vuoto..
    Una lista di passeggero cosa significa? Come si inizializza? Sarebbe la cosa del punto precedente che non ho capito?
    Non ho capito quando dici "Tu vuoi una lista di passeggeri, non una lista di nomi a caso..."
    In realtà io voglio semplicemente che quando dal menù scelgo l'opzione stampa, io visualizzi tutti i passeggeri che si sono registrati, quindi che hanno inserito nome e cognome e poi il numero che è stato assegnato loro. Per il nome della variabile hai ragione..l'ho chiamata "v" per non perdere tempo e vedere subito se funzionava.
    Quel pezzo non è sensato, stai assegnando alla stringa nome (che all'inizio contiene il nome inserito da tastiera) il contenuto del vettore vett.
    Tu devi fare il contrario, e soprattutto non in un ciclo. Tu vuoi aggiungere un solo passeggero (dopo averlo creato, non devi aggiungere il nome al vettore), non devi fare un ciclo ma un'unica operazione di assegnamento.
    Questa è la parte più importante da capire, come fai a sapere in quale indice del vettore inserirai il nuovo passeggero creato? Devi avere una variabile che conti quanti passeggeri hai già inserito, e si incrementi all' inserimento di ogni passeggero (ma dovrai fermarti a un certo punto).
    E' vero, dovevo fare al contrario, quindi tipo vett = nome;
    Se non ho capito male, tu mi stai dicendo di fare una specie di contatore..quindi mettiamo appunto che io chiami il contatore "cont", lo inizializzo a 0.
    Poi, ogni volta che inserisco il nome, lo incremento di uno con cont++;
    Dopo di che scrivo vett[cont]=nome;
    Giusto?
    Il contatore lo devo incrementare sia dopo il nome che dopo il cognome(quindi due volte)?
    In questo modo però ci staranno solo 5 utenti credo..perchè se assegno come lunghezza del vettore 10, posso mettere 5 nomi e 5 cognomi..o devo contare anche il numero? Quindi 10/3?

    Per la classe volo per ora lasciamo perdere..non mi interessa sapere a che volo sono assegnati i passeggeri..voglio solo fare un sistema che mi faccia vedere il nome e il cognome dei passeggeri che si sono registrati presso il mio aeroporto(al limite questa cosa la implementiamo dopo)
  • Re: Aiutino per richiamare metodi di altre classi?

    Incredibile!! Forse c'è l'ho fatta!! Ho trovato su yahoo answer un programma dove si inseriva valore e peso di una moneta in un array...e "copiandolo" c'è l'ho fatta..ti faccio vedere il codice(adesso poi con calma, se è giusto, inseriamo tutti i controlli necessari, come ad esempio non stampare niente se il vettore è null(credo di saperlo fare) e poi tutto il resto che dicevi tu. Intanto ti posto il codice(incompleto, ad esempio per il momento ho lasciato vuoto il metodo modificaPasseggero
    
    package aereoporto;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Registrazione {
    
        Scanner tastiera = new Scanner(System.in);
        private String scelta;
        Passeggero[] passeggeri = new Passeggero[10];
       
        
        public void gestisciOperazioni(){
            
           do{ System.out.println("Seleziona una voce dal menù: ");
            System.out.println("1 Registra nuovo passeggero");
            System.out.println("2 Stampa lista passeggeri");
            System.out.println("3 Modifica dati passeggero");
            scelta = tastiera.nextLine();
            switch(scelta){
                case "1":
                inserimentoPasseggero();
                break;
                case "2":
                stampaPasseggeri();
                break;
                case "3":
                modificaPasseggero();
                break;
                default:
                System.out.println("Scelta non valida. Riprovare.");
                
              }}while(scelta.equals("1") || scelta.equals("2") || scelta.equals("3"));
            
        }
        
        public void inserimentoPasseggero() {
           for(int i=0; i<passeggeri.length; i++){
            System.out.println("Benvenuto! Inserisca il suo nome : ");
            String nome = tastiera.nextLine();
            System.out.println("Inserisca il suo cognome : ");
            String cognome = tastiera.nextLine();
            passeggeri[i] = new Passeggero(nome, cognome);
            System.out.println("Registrazione avvenuta con successo!");
             Passeggero p = new Passeggero(nome, cognome);
           
            gestisciOperazioni();
           }
        }
        public void stampaPasseggeri(){
            for (int i=0; i<passeggeri.length; i++){
            System.out.println(passeggeri[i]);
            }
            
            gestisciOperazioni();
        }
       
        public void modificaPasseggero(){
        }
       
    }     
    
    Spero sia giusto, almeno possiamo andare avanti..anche perchè tra un po' ti viene voglia di abbandonarmi a me stesso, data la lentezza con cui procedo
    Edit: no..no..è sbagliato..perchè se inserisco nome e cognome, poi scelgo di nuovo di inserire nome e cognome, e infine stampo..mi stampa di nuovo solo l'ultimo inserito..sto provando inserendo la variabile cont ma adesso nemmeno più inserire il nome mi fa...se non risolvo posto il codice
  • Re: Aiutino per richiamare metodi di altre classi?

    Perdona il triplo post..ma finalmente funziona, tranne per una cosa..il numero incrementa di 2 alla volta..quindi stampa tipo 0 per il primo passeggero, 2 per il secondo, 4 per il terzo ecc..posto il codice di nuovo:
    
    package aereoporto;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Registrazione {
    
        Scanner tastiera = new Scanner(System.in);
        private String scelta;
        private int cont = 0;
        Passeggero[] passeggeri = new Passeggero[10];
       
        
        public void gestisciOperazioni(){
            
           do{ System.out.println("Seleziona una voce dal menù: ");
            System.out.println("1 Registra nuovo passeggero");
            System.out.println("2 Stampa lista passeggeri");
            System.out.println("3 Modifica dati passeggero");
            scelta = tastiera.nextLine();
            switch(scelta){
                case "1":
                inserimentoPasseggero();
                break;
                case "2":
                stampaPasseggeri();
                break;
                case "3":
                modificaPasseggero();
                break;
                default:
                System.out.println("Scelta non valida. Riprovare.");
                
              }}while(scelta.equals("1") || scelta.equals("2") || scelta.equals("3"));
            
        }
        
        public void inserimentoPasseggero() {
            
           for(int i=0; i<passeggeri.length; i++){
               cont++;
            System.out.println("Benvenuto! Inserisca il suo nome : ");
            String nome = tastiera.nextLine();
            System.out.println("Inserisca il suo cognome : ");
            String cognome = tastiera.nextLine();
            passeggeri[cont] = new Passeggero(nome, cognome);
            System.out.println("Registrazione avvenuta con successo!");
             Passeggero p = new Passeggero(nome, cognome);
           
            gestisciOperazioni();
           }
        }
        public void stampaPasseggeri(){
            for (int i=0; i<passeggeri.length; i++){
            System.out.println(passeggeri[i]);
            }
            
            gestisciOperazioni();
        }
       
        public void modificaPasseggero(){
        }
       
    }     
    
    
    Mi dispiace che ora ti faccio leggere e magari rispondere a 3 post(spero che non stai scrivendo mentre sto inviando questo messaggio)
  • Re: Aiutino per richiamare metodi di altre classi?

    Ho visto che hai inserito nuovi messaggi, ma stavo già scrivendo questo e intanto te lo mando, leggi comunque e in seguito mi leggerò i tuoi progressi

    xXNicolaXx ha scritto:


    Si, la parte equalsIgnoreCase non serve perchè sto confrontando l'inserimento di un numero, che non può essere maiuscolo o minuscolo, giusto?
    Il try-catch l'ho visto..però non capisco cosa intendi per "convertire la stringa in un numero". Come si fa? Se non è fondamentale, questo lo vediamo dopo..mi sa che prima devo capire altre cose più importanti.
    Giusto, era piuttosto facile. Per convertire una stringa in numero si intende un metodo che automaticamente legge la stringa, "capisce" se nella stringa è contenuto un numero e restituisce il valore corrispondente sotto forma di numero (la stringa di per sé non può essere forzata a "diventare" un numero, è solo un modo di dire). Uno di questi metodi è Integer.parseInt(String s). Ad esempio :
    
    int n = Integer.parseInt("5");
    
    Dopo questa istruzione in n, che è di tipo intero, sarà contenuto il valore 5. Non è fondamentale certo, e come dicevo dovrai gestire la possibile NumberFormatException, ci arriverai più avanti, non è un problema.

    xXNicolaXx ha scritto:


    
    public class Volo
    {
       private Passeggero[] passeggeri;
       public Volo (int massimoPasseggeri)  {
          passeggeri = new Passeggero[massimoPasseggeri];
       } 
       
    ecco..qua dobbiamo(e con dobbiamo intendo devo ) capire bene questo passaggio...quando tu scrivi
    
    private Passeggero[] passeggeri;
    
    Nella classe Volo stai creando un vettore che si chiama passeggeri(giusto?) che appartiene alla classe Passeggero OPPURE di tipo Passeggero(di tipo significa mica che appartiene alla classe con quel nome?). Facendo in questo modo, il vettore passeggeri, cos'ha di "speciale". Nel senso..è visibile all'interno della classe Passeggero? Prende gli attributi della classe? I parametri del costruttore? Su questa cosa sto impazzendo da giorni e non riesco a capirla nemmeno leggendo online...
    Ok finalmente emerge il problema! Avevo immaginato che il concetto vettore/oggetto non ti fosse chiarissimo ma non avevo capito fino a quanto.
    La prima parte ovviamente è ok, passeggeri è solo il nome del vettore, puoi chiamarlo in qualunque altro modo, solo che così ha più senso.
    Mi permetto di citare questa definizione tratta da: :
    Un array in Java è un contenitore che permette di gestire una sequenza di lunghezza fissa di elementi tutti del medesimo tipo.
    Ne avrai già lette di definizioni, forse con parole diverse e meno chiare, non ne ho idea.
    Il tipo del tuo array è in questo caso Passeggero, che è una classe (il vettore può anche contenere oggetti di tipo primitivo, come int, char, short, ...).

    Poi fai un po' di giochi di parole . Il vettore di per sè non appartiene alla classe Passeggero, semmai appartiene alla classe Registrazione, cioè è un campo di istanza della classe nella quale viene definito, e se è dichiarato private è visibile solo nella classe Registrazione (ci sono delle eccezioni, per ora lascia stare). Ma il termine appartiene può essere fonte di confusione.
    Anche la seconda frase è un po' simile, il vettore di per sé non è di tipo Passeggero (sul vettore inteso come tale non puoi fare nulla di ciò che puoi fare a un passeggero, è solo il contenitore). Contiene all'interno elementi che sono di tipo Passeggero semmai.

    Cos'ha di speciale beh, non so se lo definirei speciale, ma tu sei certo che qualsiasi elemento prenderai da quel vettore sarà un oggetto Passeggero. Cioè non potrai mai inserirci all'interno qualcosa che non sia un oggetto Passeggero, se provi a metterci dentro una stinga, un intero, un oggetto Registrazione, non te lo lascia fare! Puoi solo inserire un Passeggero o un oggetto di una classe che estenda Passeggero.
    Questo ti assicura che quanto tu vai a prendere un qualsiasi elemento di quel vettore potrai richiamarci sopra il metodo getNome(), getCognome() e così via, perché avrai sempre a che fare con un oggetto di quella classe.

    E' visibile all'interno della classe Passeggero? Assolutamente no! Il fatto che un vettore contenga oggetti di quella classe non vuol minimamente dire che la classe Passeggero possa vedere/accedere al vettore. E non deve neanche poterlo fare! Immagina un esempio simile, forse più chiaro, tu hai una CartaDaGioco. La carta conosce il proprio seme e il proprio valore (asso,tre,re,...).
    La singola carta ha bisogno di conoscere quante/quali altre carte esistono? No, la carta è la tua entità di base, sarà un'altra classe che creerà e inserirà da qualche parte varie carte, ma la singola carta di questo non ne sa nulla! Spero che questo sia chiaro (il vettore comunque se dichiarato come public comunque sarà visibile in tutte le tue classi, ma questo è sconsigliabile)

    Quindi il vettore non prende né attributi, ne costruttori, né metodi di Passeggero, sono gli elementi all'interno che lo fanno.

    xXNicolaXx ha scritto:


    Una lista di passeggero cosa significa? Come si inizializza? Sarebbe la cosa del punto precedente che non ho capito?
    Non ho capito quando dici "Tu vuoi una lista di passeggeri, non una lista di nomi a caso..."
    In realtà io voglio semplicemente che quando dal menù scelgo l'opzione stampa, io visualizzi tutti i passeggeri che si sono registrati, quindi che hanno inserito nome e cognome e poi il numero che è stato assegnato loro. Per il nome della variabile hai ragione..l'ho chiamata "v" per non perdere tempo e vedere subito se funzionava.
    L' ArrayList che hai definito non è parametrizzata, cioè non hai assegnato nessuna tipo alla lista. Quindi a priori la lista non sa che cosa contiene, e questo è molto pericoloso perché quando provi ad estrarre un elemento non sai che cosa sarà (e dovrai fare un cast che può fallire a runtime).
    Quando provi ad aggiungere un oggetto a una lista senza tipo ottieni un messaggio di warning come questo (il compilatore ti avverte che c'è qualcosa di strano, poi devi ricompilare con l'opzione che ti viene suggerita per leggere il warning):
    
    warning: [unchecked] unchecked call to add(E) as a member of the raw type ArrayList
    
    Questo è in effetti un avvertimento, non un errore, quindi lo puoi fare tecnicamente (ma non dovresti assolutamente!).

    Per creare una lista di oggetti Passeggero si fa così :
    
    ArrayList<Passeggero> listaPasseggeri = new ArrayList<Passeggero>();
    
    Questa è la giusta inizializzazione. Le parentesi angolari non le avrai ancora mai viste forse, è qualcosa di un po' più avanzato.
    Se tu fai quello che stavi facendo prima (immagina di aver definito l'ArrayList come lista di String) e aggiungi stringhe alla lista ottieni qualcosa del genere: ["Mario", "Rossi", "Paolo", "Bianchi",...].
    Questa è una lista di stringhe ovviamente, non sono passeggeri! Hai inserito dentro informazioni alla rinfusa, che messe così sono ben poco utili!

    Tu vorrai invece avere una lista di passeggeri (ovviamente intendo sempre Passeggero, uso il plurale solo per comodità), per poter estrarre un Passeggero dalla lista,visualizzarne i dati, modificare i dati (metodi getter e setter creati), etc. Se l'oggetto che estrai non è di tipo Passeggero, col cavolo che puoi farci sopra "getNome()" o altro!

    xXNicolaXx ha scritto:


    E' vero, dovevo fare al contrario, quindi tipo vett = nome;
    Se non ho capito male, tu mi stai dicendo di fare una specie di contatore..quindi mettiamo appunto che io chiami il contatore "cont", lo inizializzo a 0.
    Poi, ogni volta che inserisco il nome, lo incremento di uno con cont++;
    Dopo di che scrivo vett[cont]=nome;
    Giusto?


    Ok il contatore. Se il contatore è inizializzato a 0 però, devi incrementarlo dopo aver aggiunto il primo passeggero, altrimenti lo inserirei in posizione 1 (l'indice parte da 0).
    Inoltre non devi assegnare "nome" all'interno del vettore, ma il Passeggero creato e che per ora, in inserimentoPasseggero, stai memorizzando nella variabile "p".

    xXNicolaXx ha scritto:


    Il contatore lo devo incrementare sia dopo il nome che dopo il cognome(quindi due volte)?
    In questo modo però ci staranno solo 5 utenti credo..perchè se assegno come lunghezza del vettore 10, posso mettere 5 nomi e 5 cognomi..o devo contare anche il numero? Quindi 10/3?


    Se hai capito ciò che ho scritto, questo dubbio si risolve da solo, tu non inserisci prima il nome e poi il cognome, ma un solo oggetto Passeggero creato con un certo nome e un certo cognome.
  • Re: Aiutino per richiamare metodi di altre classi?

    Mi hai fatto una spiegazione splendida. Complimenti e grazie davvero.
    Me la rileggo ancora qualche volta perchè ho bisogno di capire bene alcune cose..nel frattempo ti chiedo ancora una cosa sugli oggetti...
    Per farlo, ti riporto una parte di codice di un pdf che si può trovare online, che spiega oggetti e classi. Fa l'esempio di una bicicletta e...vabbè, ti scrivo tutto dopo il codice, riportando pari pari quello che dice il pdf.
    
    Class Bicycle {
    
    int cadence = 0;
    int speed = 0;
    int gear = 1;
    
    void changeCadence(int newValue) {
    cadence = newvalue;
    }
    void changeGear(int newValue) {
    gear = newValue;
    }
    void speedUp(int increment) {
    speed = speed+increment;
    }
    void applyBrakes(int decrement) {
    speed = speed - decrement;
    }
    void printStates() {
    System.out.println("cadence:"+cadence+"speed:"+speed+"gear:"+gear);
    }
    
    Riporto ora la spiegazione:
    - I campi cadence,speed e gear rappresentano lo stato dell'oggetto, e i metodi(changeCadence, changeGear, speedUp ecc) definiscono le sue interazioni col mondo esterno.
    - Si nota che la classe bicicletta non ha un metodo main. Questo dipende dal fatto che essa non costituisce una applicazione completa; essa è solo il modello per biciclette che potranno essere utilizzate in una applicazione.
    -La responsabilità di creare e usare nuovi oggetti bicicletta è demandata ad altre classi dell'applicazione.

    Ora, quello che voglio capire...nella classe bicicletta, non ci sono oggetti, giusto? L'oggetto è quella "cosa" che viene dichiarata con nomeclasse nomeoggetto = new nomecostruttore(parametri), giusto? O forse tutti gli attributi e i metodi della classe Bicycle rappresentano un oggetto però in senso astratto, nel senso che se paragonato alla realtà, la bicicletta è un oggetto e ha quelli stati e funzioni?
    Nel nostro caso abbiamo creato l'oggetto "p", che è di tipo passeggero(quindi di tipo passeggero significa che richiama metodi o attributi della classe passeggero? giusto per capire se ho capito).
    Adesso, proprio mentre scrivevo il messaggio, ho risolto involontariamente il problema che i numeri venivano incrementati di 2 alla volta.
    Considera il mio ultimo codice funzionante, che però aveva il problema dei numeri doppi appunto. Ho semplicemente tolto
     Passeggero p = new Passeggero(nome, cognome); 
    che si trovava sotto
    System.out.println("Registrazione avvenuta con successo!"); 
    e adesso appunto funziona..però vorrei capire perchè..Come mai creava il problema del numero doppio, se io passavo solo le stringhe nome e cognome nel costruttore? Il numero non lo richiamavo, vero?
    ps. il contatore l'ho spostato dopo l'inserimento perchè altrimenti creava il problema che dicevi tu
Devi accedere o registrarti per scrivere nel forum
40 risposte