Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Esercizio da libro

Hybrid View

  1. #1
    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).

  2. #2
    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

  3. #3
    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

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