Corso base Java: bisogno di aiuto

di il
23 risposte

23 Risposte - Pagina 2

  • Re: Corso base Java: bisogno di aiuto

    Purtroppo -come sempre- non abbiamo più ripreso questo esercizio e non scoprirò mai come finirlo.
    Ho fatto altri ragionamenti, sono riuscito ad eliminare diverse righe di codice, ma non sono riuscito ad utilizzare per bene gli array (che tra l'altro abbiamo studiato ieri, dopo un mese di corso). Non riesco a capire come far capire alla macchina che il "20" di 1920 lo trova all'indice2 dell'array decina. Abbiamo poi rifatto -dopo aver introdotto il concetto di classe e metodi astratti- l'esercizio sulle figure geometriche, questo volta con metodi e classe astratta, come suggerivi tu.

    Vorrei un opinione sull'esercizio del we.
    Traccia: distributore di snack, bevande, panini. Ogni distributore può contenere al massimo un totale di 50 prodotti. I vari prodotti hanno in comune degli attributi come la marca ed il prezzo, ed in più hanno alcuni attributi propri. Bisogna quindi andare a creare gli oggetti, stampare la lista completa, definire un metodo per la scelta del prodotto da consumare, la nuova stampa dei prodotti presenti nel distributore (quindi senza quello appena scelto).

    Ho pensato di agire in questo modo:
    -classe astratta Prodotto, con attributi marca e prezzo, quindi costruttore ecc
    - le tre class snack, bevande, panini con i loro attributi + quelli ereditati.
    - classe distributore, quella col main, dove vado a creare i prodotti. Dichiaro un array di oggetti, quindi Prodotto[] P = new Prodotto[50];
    Un for che va da 0 alla lunghezza del mio array, con uno switch che a seconda della parola digitata tra snack, bevande, panini mi andrà a creare un oggetto di quel tipo (chiedendomi di inserire le relative caratteristiche). In tutti gli altri casi, in quell'indice del mio array non ci sarà nessun oggetto.
    Per la stampa della lista completa dei prodotti ho pensato sempre ad un for che va da 0a50, che mi va a stampare tutti gli oggetti del mio array se in quell'indice il valore è diverso da null (altrimenti credo stamperebbe anche il valore "null" oltre gli oggetti con relativa scheda).

    Per la scelta del prodotto da prelevare, a seconda del numero che digito mi restituisce il prodotto posizionato in quell'indice del mio array con la sua scheda. Ora dovrei anche il numero totale dei prodotti rimasti... far assumere valore nullo all'indice appena "svuotato" ci sono, ma per incrementare il contatore ogni volta che trova un prodotto non so come fare.

    Mi manca anche capire cosa fare per non farlo andare avanti se ad esempio nel caso di snack, a domanda "dolce o salato'" dovessi inserire una parola diversa da queste due...

    Ho scritto qualcosa di più o meno sensato per lo svolgimento della traccia? Grazie.
  • Re: Corso base Java: bisogno di aiuto

    WinstonSmith ha scritto:


    Non riesco a capire come far capire alla macchina che il "20" di 1920 lo trova all'indice2 dell'array decina.
    Ma hai (ri)letto quello che avevo detto in precedenza? I valori da 1 a 19 (il numero 0 come numero complessivo in ingresso è ancora un caso a sé stante) sono assolutamente speciali e generalmente ha senso avere un array che tiene le stringhe da "zero" fino a "diciannove".

    Da 20 in poi (fino a 99) dovresti .... saper "riconoscere" le similitudini e i casi particolari con gli altri 3x, 4x ecc.... 9x.

    WinstonSmith ha scritto:


    Ho pensato di agire in questo modo:
    -classe astratta Prodotto, con attributi marca e prezzo, quindi costruttore ecc
    - le tre class snack, bevande, panini con i loro attributi + quelli ereditati.
    Va bene classe Prodotto abstract. Vanno pure bene classi Snack, Bevanda e Panino (al singolare, non plurale!) concrete, sottoclassi di Prodotto.

    WinstonSmith ha scritto:


    - classe distributore, quella col main, dove vado a creare i prodotti. Dichiaro un array di oggetti, quindi Prodotto[] P = new Prodotto[50];
    Va bene una classe Distributore ma NON metterci un main. Definiscila solo per rappresentare la logica di gestione del distributore (pensa alle azioni che deve "saper" fare). In questa classe NON devi fare input/output verso l'utente, devi solo contenere la logica di gestione del distributore.

    Cosa deve poter fare? Pensaci: es. aggiungere un prodotto, bene metterai un metodo es.

    public boolean aggiungiProdotto(Prodotto p) { .... }

    Altro? es. quanti prodotti ci sono. Oppure "dammi il prodotto all'indice i-esimo".

    La gestione di quell'array (di 50) deve restare interna, non deve trasparire fuori. Se vuoi, se richiesto o comunque non proibito per l'esercitazione, puoi fare in modo che il costruttore riceva il numero massimo di prodotti. Quindi quel 50 non sarebbe cablato fisso in Distributore.

    Poi il main() lo metterai in un'altra classe es. ProvaDistributore o EsercizioDistributore o come ti pare.
  • Re: Corso base Java: bisogno di aiuto

    andbin ha scritto:



    Ma hai (ri)letto quello che avevo detto in precedenza? I valori da 1 a 19 (il numero 0 come numero complessivo in ingresso è ancora un caso a sé stante) sono assolutamente speciali e generalmente ha senso avere un array che tiene le stringhe da "zero" fino a "diciannove".

    Da 20 in poi (fino a 99) dovresti .... saper "riconoscere" le similitudini e i casi particolari con gli altri 3x, 4x ecc.... 9x.
    Scusami, avevo riletto ancora il tuo post, ma credevo si dovesse dichiarare un array per i numeri fino a 19 ed un altro per venti, trenta...novanta per poi andare a stampare il numero completo in stringa.

    andbin ha scritto:



    Va bene classe Prodotto abstract. Vanno pure bene classi Snack, Bevanda e Panino (al singolare, non plurale!) concrete, sottoclassi di Prodotto.
    Errore di distrazione, le tre classi le ho dichiarate al singolare

    andbin ha scritto:



    Va bene una classe Distributore ma NON metterci un main. Definiscila solo per rappresentare la logica di gestione del distributore (pensa alle azioni che deve "saper" fare). In questa classe NON devi fare input/output verso l'utente, devi solo contenere la logica di gestione del distributore.
    Quindi generalmente nella classe con il main ci si va solo ad interfacciare con l'utente, che potrà chiedere un prodotto ed avere la relativa scheda ecc ecc, mentre tutte le operazioni, i metodi, vanno dichiarati in un'altra classe, e questo vale sia per un distributore di prodotti alimentare che per tutt'altra roba? Spero d'aver capito bene, perché fino ad ora abbiamo smepre agito diversamente...
  • Re: Corso base Java: bisogno di aiuto

    WinstonSmith ha scritto:


    credevo si dovesse dichiarare un array per i numeri fino a 19 ed un altro per venti, trenta...novanta per poi andare a stampare il numero completo in stringa.
    Sì, infatti è così che avevo detto.

    Un array per i numeri "zero" ...... "diciannove" (sono i casi molto speciali percui non si può fare altro di più sensato).

    E poi un array (o due!) per i venti, trenta, ecc...
    Dico uno o due perché puoi decidere di fare l'array senza le lettere finali "vent" "trent" ecc.... e poi con della logica aggiungere "i" o "a".
    Oppure due array con e senza le finali. Si "spreca" un po' più di spazio in memoria ma si semplifica un pelino la logica.

    WinstonSmith ha scritto:


    Quindi generalmente nella classe con il main ci si va solo ad interfacciare con l'utente, che potrà chiedere un prodotto ed avere la relativa scheda ecc ecc, mentre tutte le operazioni, i metodi, vanno dichiarati in un'altra classe, e questo vale sia per un distributore di prodotti alimentare che per tutt'altra roba? Spero d'aver capito bene, perché fino ad ora abbiamo smepre agito diversamente...
    Sì. Se separi bene le cose, fai in modo che ogni classe abbia un solo scopo principale, è sempre meglio.
  • Re: Corso base Java: bisogno di aiuto

    Non ne azzecco una... stamattina ho eseguito l'aggiornamento che mi veniva suggerito ogni volta che accedevo ad eclipse ed ora mi appare questo messaggio, gentilmente potreste dire come posso risolvere... grazie.


    https://ibb.co/3C2G67
  • Re: Corso base Java: bisogno di aiuto

    WinstonSmith ha scritto:


    Non ne azzecco una... stamattina ho eseguito l'aggiornamento che mi veniva suggerito ogni volta che accedevo ad eclipse ed ora mi appare questo messaggio, gentilmente potreste dire come posso risolvere... grazie.


    https://ibb.co/3C2G67
    C'è scritto cosa non va, non trova più il riferimento a JRE 8.201. Prova a reinstallarlo. Oppure se sei passato alla 8.211 disinstalla e reinstalla Eclipse. Oppure passa a un IDE che non ti metta sempre intoppi di mezzo a ogni passo, tipo IntelliJ Idea
  • Re: Corso base Java: bisogno di aiuto

    WinstonSmith ha scritto:


    Non ne azzecco una... stamattina ho eseguito l'aggiornamento che mi veniva suggerito ogni volta che accedevo ad eclipse ed ora mi appare questo messaggio, gentilmente potreste dire come posso risolvere... grazie.
    Ti consiglio di impostare sempre il path al launcher della JVM nel file eclipse.ini (è nella stessa directory del eclipse.exe).
    I dettagli li trovi alla pagina https://wiki.eclipse.org/Eclipse.ini#Specifying_the_JV

    Basta mettere due righe prima della opzione -vmargs
    Questo ti permette di avere pieno controllo della JVM usata per lanciare Eclipse e ti evita grane con la variabile di ambiente PATH (che potrebbe essere modificato da altre installazioni di software).
  • Re: Corso base Java: bisogno di aiuto

    Grazie mille ad entrambi, problema risolto.
  • Re: Corso base Java: bisogno di aiuto

    Il corso è stato sospeso per i troppi ritiri, peccato che tra la mia inesistente preparazione iniziale (non avevo mai neppure scritto un "Hello World") ed i continui cambi di insegnanti (4 in 8 settimane) sia riuscito ad imparare davvero poco, al momento riesco a svolgere facilmente pochi esercizi e tutti dello stesso tipo (ad esempio quello del contocorrente che credo sia un classico delle scuole superiori).

    Sto provando a studiare un po' da me, per poi riprendere un corso base dopo l'estate.

    Stavo vedendo un esercizio:
    Gestione di una società che permette di noleggiare libri (per 4 settimane) e dvd (per 1 settimana).
    Libri e dvd hanno un titolo ed un autore. Ogni cliente ha un id e può chiedere al max 2 prestiti.
    Bisogna poter dare al cliente la possibilità di stampare i prodotti disponibili, solo i libri o solo i dvd.

    Pensavo di agire in questo modo:
    Classe astratta Prodotto con attributi titolo, autore, numeroDiCopie ed come metodi un booleano che mi dà true se il numero di copie è >0 ed un int che mi dà il nuovo numero di copie del libro (quindi numeroDiCopie-1).
    Classi -sottoclassi di Prodotto- Libro e DVD con attributi casaEditrice ed etichetta.
    Classe Cliente con attributi Id e numeroPrestiti, mentre per metodi un booleano che mi dà true se la variabile numeroPrestiti è <=2 ed un metodo int che mi aggiorna il numeroPrestiti (quindi numeroPrestiti-1).
    La classe Società dove vado a dichiarare il metodo Stampa che mi va a stampare tutti i prodotti (mentre per stampare solo libri o solo dvd devo usare l'instanceof?) ed il metodo Noleggia che funziona in questo modo: verifica se è disponibile, verifica se il cliente può chiedere un noleggio, effettua il noleggio con stampa del prodotto, aggiorna il numero di copie disponibili, aggiorna il numero di noleggi disponibili per quel cliente.
    Poi ci sarebbe da stampare la data corrente e quella della restituzione... devo creare un metodo a parte per la gestione delle date?
    Infine nella classe col main inserisco un menu che gestisco attraverso uno switch ed in base alla scelta (stampa, noleggia, restituisci) mi vado a richiamare i rispettivi metodi.

    Spero di non aver fatto troppi errori...
    mentre un paio di cose che non mi sono chiare.. ho letto degli arraylist, che non bisogna dichiarare una dimensione come si fa con gli array, come si aggiungono e come si rimuovono oggetti. Ok, ma se vado a prelevare un libro, vado a rimuovere quell'oggetto dal mio arraylist... e quando il cliente dovrà restituirlo quindi dovrà ricompilare la scheda (titolo,, autore, numerocopie, disponibilità)? ma queste operazioni non dovrebbero toccare al cliente... il metodo restituzione non so proprio come scriverlo.
    E gli oggetti ( un arraylist di oggetti libro e dvd ed un altro arraylist di cliente) dove dovrei crearli, in quale classe?
Devi accedere o registrarti per scrivere nel forum
23 risposte