Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Esercizio da libro

  1. #1

    Esercizio da libro

    Salve a tutti, mi stavo allenando con esercizi presi da un libro su Java e a fine capitolo su Incapsulamento, Ereditarietà e polimorfismo viene proposto questo esercizio.
    codice:
    //Queste sono le specifiche dei metodi di una semplice classe che trova l’età più alta dopo aver letto alcune età:
    
    public class Age
    {
    protected int highestAge;
    /**
    * Inizializza questo oggetto dì tipo Age.
    */
    public Age()
    /**
    * Restituisce l'età più alta tra quelle lette da tastiera.
    * Il valore sentinella è -l.
    *
    * @param se lo Scanner usato per leggere le età.
    *
    * @treturn l'età più alta tra quelle lette tramite se.
    *
    */
    public int findHighestAge(Scanner se)
    } // classe Age
    
    //a. Scrivere le definizioni dei metodi della classe Age.
    //b. Collaudare la classe Age sviluppando ed eseguendo un progetto che la usi.
    Come posso impostarlo? Grazie mille
    Ultima modifica di senseilaus; 06-09-2017 a 20:40

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Non mi pare uno degli esercizi migliori su incapsulamento, ereditarietà e poliformismo

    Più che altro non vedo granché di utile, il costruttore non deve fare niente (a meno che tu non voglia impostare highestAge a un valore negativo, visto che di default è già messa a 0 senza costruttore), la stessa variabile di istanza highestAge non ha senso di esistere, a meno che non si voglia "conservare" il massimo tra diverse chiamate del metodo findHighestAge (ma è scritto che viene ritornata l'età più alta tra quelle lette dallo Scanner se).

    L'unica cosa che devi fare è leggere i valori dallo scanner e trovare il massimo: si parla di valore sentinella, quindi dovrai creare un ciclo infinito (ad esempio while (true) ...) che si interrompe quando il valore inserito è pari a -1.

    Quello che devi sapere è quindi:

    - Come leggere un valore da scanner
    - Come aggiornare il massimo quando dovuto
    - Come terminare il ciclo quando trovi il valore sentinella

    E' tutto molto semplice, dai un'occhiata sul libro o in rete e prova a scrivere tu la soluzione, poi se non riesci siamo qua

    PS: Consiglierei di leggere i numeri da Scanner come stringa, e di provare a fare tu la conversione in numero (vedi Integer.parseInt ()).
    Potresti anche inserire un controllo per testare che il numero sia effettivamente un numero (e positivo) e in caso stampare un messaggio d'errore (o meglio lanciare un'eccezione, ma non so se hai già visto le eccezioni e i blocchi try-catch).

  3. #3
    Ciao e prima di tutto, grazie davvero tanto per la tempestivissima risposta!
    Io in realtà un'idea in generale di come risolverlo ce l'avevo, è che i dubbi mi sono venuti proprio dai punti che hai messo in luce tu!
    Tipo:
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Non mi pare uno degli esercizi migliori su incapsulamento, ereditarietà e poliformismo
    In effetti, non ci vedrei tanta utilità nello scomodare tutte queste proprietà per un esercizio del genere, eppure l'esercizio fa parte del capitolo dedicato alla spiegazione di un'interfaccia(con esempio), di una classe che la implementa(con esempio) e di una funzione che utilizza la classe. (L'esempio riguarda INTERFACCIA: Impiegato, CLASSE: ImpiegatoATEmpoPieno, FUNZIONE:Azienda).

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Più che altro non vedo granché di utile, il costruttore non deve fare niente (a meno che tu non voglia impostare highestAge a un valore negativo, visto che di default è già messa a 0 senza costruttore), la stessa variabile di istanza highestAge non ha senso di esistere, a meno che non si voglia "conservare" il massimo tra diverse chiamate del metodo findHighestAge (ma è scritto che viene ritornata l'età più alta tra quelle lette dallo Scanner se).
    Proprio così! Non saprei davvero come rendere utili costruttore e instanza.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    PS: Consiglierei di leggere i numeri da Scanner come stringa, e di provare a fare tu la conversione in numero (vedi Integer.parseInt ()).
    Potresti anche inserire un controllo per testare che il numero sia effettivamente un numero (e positivo) e in caso stampare un messaggio d'errore (o meglio lanciare un'eccezione, ma non so se hai già visto le eccezioni e i blocchi try-catch).
    Ahimè son tutte cose che non ho ancor visto.

    Il mio dubbio deriva proprio dal fatto che, tutto il codice che ho inserito NON L'HO iniziato io, ma è l'esercizio così e chiede di essere completato in quella maniera. Quindi mi fa pensare che io debba trattare l'esercizio come l'esempio che viene spiegato nel capitolo, che viene impostato proprio in maniera simile.

    La mia idea, consapevole del fatto che sia molto sempliciotta nella mia inesperienza, era:
    codice:
    //Uno Scanner che contenga in "sc" i miei input 
    Scanner sc=new Scanner(System.in);
    final String MESSAGGIO="Inserisci età: ";
    int età=0;
    int etàPiùAlta=0;
    final int SENTINELLA=-1;
    
    //Ciclo while finchè non becco la sentinella
    while (true) {
    System.out.println(MESSAGGIO);
    età=sc.nextInt();//Da definire!!
      if (età==SENTINELLA)
    break
    trovaEtàPiùAlta(sc);//Definisco il metodo altrove
    Ora, i miei dubbi sono tre per l'appunto:
    1. Come faccio a conservare tanti elementi(numeri) in input in un solo "oggetto"? E' evidente che "età=sc.nextInt()" non sia il metodo adatto.
    2. Come confronto tra di loro e assegno valore ad ognuno di questi elementi?
    3. Come dovrei applicare l'esercizio già impostato in tutto questo?

    Grazie mille ancora

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da senseilaus Visualizza il messaggio
    [...] eppure l'esercizio fa parte del capitolo dedicato alla spiegazione di un'interfaccia(con esempio), di una classe che la implementa(con esempio) e di una funzione che utilizza la classe. (L'esempio riguarda INTERFACCIA: Impiegato, CLASSE: ImpiegatoATEmpoPieno, FUNZIONE:Azienda).
    Ok, mi mancava questa parte, comunque confermo l'impressione che quella parte là di consegna che hai postato non sembra il massimo per com'è scritta.

    Quote Originariamente inviata da senseilaus Visualizza il messaggio
    Ahimè son tutte cose che non ho ancor visto.
    Immaginavo, sono però tutte cose che dovrai imparare ben presto (il try-catch magari un po' in seguito), se vuoi portarti avanti risparmi fatica in seguito (nel PS ti posto un link "interessante" a tal fine)


    Quote Originariamente inviata da senseilaus Visualizza il messaggio
    La mia idea, consapevole del fatto che sia molto sempliciotta nella mia inesperienza, era:
    codice:
    //Uno Scanner che contenga in "sc" i miei input 
    Scanner sc=new Scanner(System.in);
    final String MESSAGGIO="Inserisci età: ";
    int età=0;
    int etàPiùAlta=0;
    final int SENTINELLA=-1;
    
    //Ciclo while finchè non becco la sentinella
    while (true) {
    System.out.println(MESSAGGIO);
    età=sc.nextInt();//Da definire!!
      if (età==SENTINELLA)
    break
    trovaEtàPiùAlta(sc);//Definisco il metodo altrove
    Ora, i miei dubbi sono tre per l'appunto:
    1. Come faccio a conservare tanti elementi(numeri) in input in un solo "oggetto"? E' evidente che "età=sc.nextInt()" non sia il metodo adatto.
    2. Come confronto tra di loro e assegno valore ad ognuno di questi elementi?
    3. Come dovrei applicare l'esercizio già impostato in tutto questo?
    Come idea non va affatto male (va bene anche l'idea di usare le costanti, soprattutto per il valore di sentinella, ma non abusarne), alcuni appunti:

    - Non usare mai nomi di variabili, classi, o metodi che contengono nomi accentati, anche nelle stringhe sarebbe meglio stare attenti con l'encoding, una soluzione tradizionale è quella di usare l'apostrofo al posto degli accenti (non nelle variabili!), poi si può certo impostare l'encoding, ma è più sicuro evitare.
    - La variabile età non serve a nullla. Se vuoi memorizzare tutti i valori inseriti devi usare una struttura dati adeguata: un array di dimensione fissa o una lista (che in questo caso è più adatta allo scopo) sono le soluzioni più elementari, ce ne sono altre che per ora non ti servono. Ma comunque dovrai assegnare ciò che leggi da scanner a una variabile, che sarà locale al ciclo (es. int eta = sc ...).
    - Se vuoi memorizzare tutti i valori allora ha senso usare l'istruzione break e un metodo che trovi il massimo, però il metodo non dovrà mai e poi mai prendere come parametro lo scanner: i valori li hai già letti ed assegnati, quindi eventualmente passerei l'array o la lista che contiene i valori.
    - Se non vuoi memorizzare tutti i valori (non è richiesto!) allora il break è superfluo, perché il metodo può direttamente ritornare il valore del massimo.

    Per quanto riguarda le tue domande penso di aver già risposto alla prima (se non hai ancora visto array e liste devi farlo al più presto).

    Non sono sicuro di capire la tua seconda domanda perché non so che oggetto pensavi di usare per memorizzare i numeri, ma se usi un array o lista di interi il confronto lo fai direttamente con gli operatori < = > usati correttamente in una clausola if.
    Non so se il problema sia come trovare il massimo, ma se fosse questo il caso vorrei che mi dicessi tu la soluzione, è davvero immediato!

    Per la terza domanda intendi come collaudare la classe Age? Se sì ti basta una classe esterna che abbia un metodo main che istanzi un oggetto Age e poi richiami il suo metodo findHighestAge, passando uno Scanner come parametro (ricordati di creare un solo oggetto Scanner).

    PS: Se vuoi in questa discussione trovi qualcosa di molto interessante per il tuo problema: ti spiega perché in genere è meglio usare nextLine con lo Scanner al posto di nextInt, e mostra un uso del try-catch e dell' Integer.parseInt (in particolare il post #5 di @LeleFT)
    Ultima modifica di Ansharja; 07-09-2017 a 01:00

  5. #5
    Ciao. e prima di tutto grazie ancora per tutte le informazioni, ho seguito passo passo. Mi sono un po' studiato le arrayList. All'inizio avevo difficoltà, poichè volevo creare un Array che contenesse tutte le età in input. Dal momento che la traccia non dice QUANTE età contenere, ho pensato di creare un Array vuoto senza dimensioni..ma questo non si può fare. Quindi ho optato per un ArrayList<int>, sapendo di dover usare solo numeri. Ho poi capito che non potevo utilizzare un primitivo ma un oggetto,così mi sono visto anche l'Integer, che (correggimi se sbaglio) trasforma il primitivo "int" in un oggetto.

    Ho pensato a questo:

    codice:
    public class AllHighestAge {
    
        public static void main (String[] args)
        { new AllHighestAge().run();  }
        
       public void run() {
            Scanner input = new Scanner(System.in);
    //creo una lista vuota senza dimensioni che contiene le età
            ArrayList<Integer> list = new ArrayList<Integer>();
            final int sentinel=-1;
    //ciclo per inserimento        
            while(true) {
              System.out.println("Enter an age: ");
               int age=input.nextInt();
                    if (age==sentinel) 
                    break;
                list.add(age);
              }
             System.out.println(list);
    //instanzio un Integer con le dimensioni della lista creata
             Integer a[]=new Integer
    [list.size()];
    //trasformo la lista in un Array e lo inserisco in "a"
             list.toArray(a);
    //applico il metodo
             findHighestAge(a);                   
        }
    
    //definisco il metodo
        public void findHighestAge(Integer list[]) {
        int highestAge = list[0];
           for(int i=0; i<list.length; i++){
              if(list[i] > max){
                    highestAge = list[i];
               }
              
           }
            System.out.println("The highest age is "+highestAge);
        }
                
            }
    Ci ho messo un po' proprio perchè sto studiando ora, e l'unico strumento che ho è la logica...Di per sè funziona, l'ho già provato. Ma come potrei implementarlo con la traccia proposta?

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da senseilaus Visualizza il messaggio
    All'inizio avevo difficoltà, poichè volevo creare un Array che contenesse tutte le età in input. Dal momento che la traccia non dice QUANTE età contenere, ho pensato di creare un Array vuoto senza dimensioni..ma questo non si può fare. Quindi ho optato per un ArrayList<int>, sapendo di dover usare solo numeri. Ho poi capito che non potevo utilizzare un primitivo ma un oggetto,così mi sono visto anche l'Integer, che (correggimi se sbaglio) trasforma il primitivo "int" in un oggetto.
    Esatto, un array deve avere una propria dimensione, si poteva anche creare un array di grandi dimensioni (un tipo primitivo non può essere null e di default l'array conterrebbe tutti i valori a 0 nel caso di int, ma in generale questa soluzione ti costringe a controllare che a una certa posizione il valore non sia null nel caso di un array di Object o derivati) ma la lista è sicuramente la soluzione migliore e più elegante.
    Ok per Integer, un ArrayList in effetti non può contenere tipi primitivi, ma non è proprio corretto dire che Integer trasformi un intero in un oggetto, è solo una classe che funziona da contenitore e incapsula al proprio interno un campo int, fornendo vari metodi di utilità (inoltre grazie all'autoboxing java consente di trattare i tipi primitivi come se fossero le proprie corrispondenti classi contenitori in diverse parti, quindi tu stai ad esempio aggiungendo degli int alla lista senza dover passare per Integer.valueOf (int number) o per il costruttore di Integer).

    Quote Originariamente inviata da senseilaus Visualizza il messaggio
    Ho pensato a questo:

    [...]

    Di per sè funziona, l'ho già provato. Ma come potrei implementarlo con la traccia proposta?
    Il codice sembra andare bene, potevi trovare il massimo direttamente a partire dalla lista senza trasformarla in array, ma non è sbagliato.
    Basta prendere l'elemento all'indice i richiamando il metodo get (i) invece di usare le parentesi quadre.
    Puoi anche utilizzare il costrutto for-each, che è molto comodo e snellisce il codice:

    codice:
    for (int number : list) {
         // non serve il metodo get o usare le parentesi, il loop prende ogni elemento della lista e lo assegna alla variabile locale number
    }

    Solo un piccolissimo particolare: se invece che inizializzare highestAge a un valore volutamente basso e poi ciclare su tutto l'array o la lista scegli di porlo già uguale al primo valore, il che è una bella cosa, quando fai il ciclo non serve ricominciare da 0, parti direttamente dall'indice 1.

    Cosa intendi con implementarlo con la traccia proposta? Hai risolto già quanto viene chiesto, hai fatto solo una cosa in più non richiesta, ovvero memorizzare tutti i valori, ma va bene.
    Se ti riferisci all'esempio con Interfaccia e le altre classi di cui parlavi sopra, non hai parlato di altre consegne ...
    Ultima modifica di Ansharja; 07-09-2017 a 15:54

  7. #7
    Grazie mille di tutte le spiegazioni.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Basta prendere l'elemento all'indice i richiamando il metodo get (i) invece di usare le parentesi quadre.
    Era quella la mia intenzione, ma utilizzando
    codice:
    ...
    public void findHighestAge(ArrayList list) {
    int highestAge=list.get(0);
    sotto il ".get(0)" mi da l'errore "cannot convert from Object to Int".

    Per il resto tutto okay, per quanto riguarda la mia richiesta sull' "implementazione" intendevo come integrare il tutto nella traccia dell'esercizio, ma non è importante.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Quote Originariamente inviata da senseilaus Visualizza il messaggio
    Grazie mille di tutte le spiegazioni.


    Era quella la mia intenzione, ma utilizzando
    codice:
    ...
    public void findHighestAge(ArrayList list) {
    int highestAge=list.get(0);
    sotto il ".get(0)" mi da l'errore "cannot convert from Object to Int".

    Per il resto tutto okay, per quanto riguarda la mia richiesta sull' "implementazione" intendevo come integrare il tutto nella traccia dell'esercizio, ma non è importante.
    Perchè gli ArrayList vanno sempre tipizzati, altrimenti stai usando le classi RAW che trattano tutto come Object:

    codice:
    public void findHighestAge(ArrayList<Integer> list) {

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2024 vBulletin Solutions, Inc. All rights reserved.