Oppure

Loading
28/01/10 16:28
zerg
Devo calcolare la media dei chilometri percorsi da un automobilista, sia i Km tra un pieno all'altro, sia i Km totali.

Dato questo codice;
import java.util.Scanner;

public class Kilometri
{
    public void calcolaMedia()
    {
        int km = 0; // inizializzo km (sono i km percorsi da un pieno all'altro)
        int lt = 0; // inizializzo lt (sono i litri inseriti da un pieno all'altro)
        double kmPercorsi; // inizializzo kmPercorsi sono i Km percorsi con i litri inseriti)
        int contatore = 0; // contatore dei pieni
        int totKm = 0; // totale dei Km percorsi
        int totLt = 0; // totale dei litri inseriti
        double totKmPercorsi; // totale dei km percorsi

        // chiedo all'utente di inserire i dati e li memorizzo nelle variabili
        Scanner input = new Scanner( System.in );
        System.out.println( "Inserisci i dati del pieno:" );
        System.out.print( "Inserisci i Km (-1 per uscire): " );
        km = input.nextInt();
        System.out.print( "Inserisci i lt: " );
        lt = input.nextInt();

        while ( km != -1 ) // entra nel ciclo se l'utente non inserisce la sentinella -1
        {
            ++ contatore; // aumento di 1 il contatore
            kmPercorsi = (double) km / lt; // calcolo i km percorsi
            System.out.printf( "I Km/l percorsi con questo pieno sono %.2f\n", kmPercorsi); // visualizzo i km percorsi
            totKm += km; // aggiungo i km al totale dei km
            totLt += lt; // aggiungo i lt al totale dei lt
            totKmPercorsi = (double) totKm / totLt; // calcolo il totale dei km percorsi
            System.out.printf( "I Km/l percorsi con %d pieni sono %.2f\n", contatore, totKmPercorsi); // visualizzo il totale dei km percorsi
            // chiedo all'utente di inserire i dati e li memorizzo nelle variabili
            System.out.println( "Inserisci i dati del pieno:" );
            System.out.print( "Inserisci i Km (-1 per uscire): " );
            km = input.nextInt();
            System.out.print( "Inserisci i lt: " );
            lt = input.nextInt();
        } // fine di while
        
        if ( contatore == 0 ) //controllo che sia stato inserito almeno un pieno
            System.out.println( "Non hai inserito nessun pieno" );
    } // fine metodo calcolaMedia
} // fine classe Kilometri
 


questa è la main
public class ProvaKilometri
{
    public static void main( String args[] )
    {
        Kilometri kilometri1 = new Kilometri(); // creo l'oggetto
        kilometri1.calcolaMedia(); // chiamata al metodo
    } // fine di main
} // fine classe ProvaKilometri



Mi domando:
Ho strutturato bene il programma? il mio dubbio... Ho racchiuso tutto dentro al metodo calcolaMedia è corretto? oppure acquisivo i dati dentro al main e li passavo tramite la chiamata al metodo, tipo kilometri1.calcolaMedia(km, lt);
Adesso devo elaborare 3 insiemi di dati e quì mi blocco, capisco che devo creare tre oggetti, tipo kilometri1, kilometri2, kilometri3 e delle variabili di istanza per memorizzare i dati, ma non riesco a capire come, o aggiungo il nome dell'automobilista, che identifica l'insieme di dati associato oppure.... che confusione, ho bisogno di un'illuminazione.

Grazie
aaa
28/01/10 19:50
netarrow
Per capire se un programma OOP è ben strutturato devi pensare al codice e alla realtà.
In questo caso cosa vuol dire la classe Kilometri? un'entità chiamata kilometri con la responsabilità calcolaMedia, senza campi d'istanza e senza la possibilità di dare all'oggetto: stato, identità, comportamento (inteso come responsabilità definita e coerente nel sistema) non ha senso in OOP, e si riduce quindi a un contenitore di vecchio codice strutturato (è un errore tipico agli inizi con la oop).

Dovresti ad esempio creare una classe Automobilista a cui dai stato e identità inserendo opportuni campi di istanza, e gli dai responsabilità da automobilista, tipo faiUnPieno() e le altre cose.

Non scrivere il programma orientato alla funzionalità, cioè non pensare a cosa deve fare, ma pensa prima ai dati di cui ha bisogno e a come relazionarli, una volta finito quello scrivere il codice funzionale coi cicli viene fuori praticamente da solo.

Altro consiglio cerca di rendere le parte "interna" il più indipendente possibile dall'interazione con l'utente, quindi le lettura e la scrittura degli input falla tutta nel metodo main e sforzati fin da subito di fare le classi "di logica" in maniera lineare, pura e pulite, poi in futuro l'obbiettivo sarà farle astrette.
Ultima modifica effettuata da netarrow 28/01/10 19:55
aaa
29/01/10 7:26
zerg
Per il momento grazie per la disponibilità... mi riservo di modificare tutto e di postare la new release.
Capisci bene che stò cercando di partire col piede giusto, sai dalle mie parti si dice che la pianta si piega da piccola, quindi meglio non prendere vizi stranii all'inizio.
Ancora grazie
aaa
29/01/10 12:18
netarrow
postami eventualmente la traccia completa dell'esercizio, così se hai altri problemi posso guidarti preparandola magari prima e fornendotela a pezzi quando ti blocchi.
aaa
31/01/10 10:16
zerg
Allora... gli esercizi di questo capitolo sono questi: (premetto che stò studiando sul libro dei Deitel, "Programmazione JAVA Fondamenti Settima edizione)

Per gli esercizi da 4.17 a 4.20, eseguite ciascuno dei seguenti passi:
a) leggete il testo del problema;
b) formulate l'algoritmo usando lo pseudocodice e il procedimento top-down per raffinameti successivi;
c) scrivete un programma in Java;
d) fate il test del programma, eliminate gli errori e mandatelo in esecuzione;
e) elaborate tre diversi insiemi di dati.

4.17
Gli automobilisti sono preoccupati per i consumi delle proprie automobili. Un guidatore ha tenuto conto dopo vari pieni di benzina dei chilometri percorsi e dei litri inseriti ogni volta che ha fatto il pieno. Sviluppate un'applicazione Java che acquisisce i chilometri percorsi e i litri inseriti (entrambi sono valori interi) a ogni pieno. Il programma dovrà calcolare i chilometri percorsi con un litro da un rifornimento all'altro e in tutto il periodo preso in considerazione. Tutti i calcoli delle medie dovranno produrre risultati in virgola mobile. Utilizzate la classe Scanner e i cicli controllati da sentinella per acquisire i dati dagli utenti.

Ecco il testo, per prima cosa quando mi rimetto a studiare sviluppo lo pseudocodice e te lo posto, così vediamo se ho capito bene, poi sviluppare il programma da uno pseudocodice corretto è relativamente facile.

PS cosa intenti per "stato, identità, responsabilità, comportamento"
Ultima modifica effettuata da zerg 31/01/10 10:18
aaa
31/01/10 13:07
netarrow
Per stato ci si riferisce all'insieme degli attributi che permettono di rendere vivo un oggetto, quindi come cambiano i valori dei suoi attributi cambia il suo stato e diventa quindi identificabile il suo ciclo di vita.

L'entità è qualcosa di più basso livello, è la capacità di Java di riconoscere l'identità di un oggetto rispetto un altro di uno stesso tipo con uno stesso stato.

Il comportamento è meramente l'insieme di tutto i suoi metodi.

Le responsabilità di una classe è qualcosa di più progettuale e rappresentano quelle 2-3 cose che a livello globale una classe deve fare, poi per farle può avere anche decine di metodi.
Valutare quali responsabilità ha ogni classe e verificare che non ce ne siano troppe è importante per non fare l'errore di avere classi troppo grosse (sarebbe un anti-pattern, errore comune da evitare, in questo caso il nome è Kitchen Sink)

Oltre al top-down che giustamente ti consigliano per pensare a come fare prima di scrivere, pensa, partendo dalla traccia, a chi sono gli attori del problema? che responsabilità ha ogni attore? come si relazionano fra loro?

Questi sono problemi semplici che si potrebbero risolvere anche alla sporca o in maniera più diretta ma prima ci si preoccupa di questo meglio è, specialmente se si è usato vb6.
aaa
01/02/10 13:14
zerg
Iniziamo, bozza pseudocodice primo raffinamento:

1) Creo la classe "Automobilista"
Creo un metodo "faiUnPieno"
Creo un metodo "calcolaKmConUnLt"
Creo un metodo "mostraKmConUnLt"
Creo un metodo "mostraKmConUnLtTot"

2) Creo la classe "ProvaAutomobilista"
Creo il metodo "main" per l'esecuzione

Questo è l'inizio, ora se è tutto ok, comincio con i raffinamenti dei vari metodi.

PS a proposito, mi butto un po in avanti, in questo caso, non è necessario inizializzare i campi di istanza con uno o più costruttori! oppure è una regola? Mi spiego meglio, se devo inizializzare un campo "nomeCorso" in una classe "Registro", allora lo inizializzo passandogli il nome del corso, ma nel caso della classe "Automobilista" non è necessario, almeno credo, penso che i campi verranno inizializzati di default e poi in esecuzione, li inizializzo io con i metodi opportuni.
Spero di essermi spiegato.
Ultima modifica effettuata da zerg 01/02/10 14:42
aaa
01/02/10 16:00
zerg
Sto provando (in pseudocodice) a collegare le due classi tra loro, non riesco a capire se il ciclo và fatto dentro la main richiamando i metodi di "Automobilista"...
Bhooo per usare i campi di "Automobilista" dal main penso che dovrò creare dei metodi per inizializzarli, o sbaglio? ex setKilometri(), setLitri()...
Allinizio è complicato, è una questione di testa credo.
Help Help Help
aaa