Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Esercizio sui cicli
Forum - Java - Esercizio sui cicli

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
zerg (Normal User)
Rookie


Messaggi: 48
Iscritto: 13/11/2009

Segnala al moderatore
Postato alle 17:28
Giovedì, 28/01/2010
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;
Codice sorgente - presumibilmente Java

  1. import java.util.Scanner;
  2.  
  3. public class Kilometri
  4. {
  5.     public void calcolaMedia()
  6.     {
  7.         int km = 0; // inizializzo km (sono i km percorsi da un pieno all'altro)
  8.         int lt = 0; // inizializzo lt (sono i litri inseriti da un pieno all'altro)
  9.         double kmPercorsi; // inizializzo kmPercorsi sono i Km percorsi con i litri inseriti)
  10.         int contatore = 0; // contatore dei pieni
  11.         int totKm = 0; // totale dei Km percorsi
  12.         int totLt = 0; // totale dei litri inseriti
  13.         double totKmPercorsi; // totale dei km percorsi
  14.  
  15.         // chiedo all'utente di inserire i dati e li memorizzo nelle variabili
  16.         Scanner input = new Scanner( System.in );
  17.         System.out.println( "Inserisci i dati del pieno:" );
  18.         System.out.print( "Inserisci i Km (-1 per uscire): " );
  19.         km = input.nextInt();
  20.         System.out.print( "Inserisci i lt: " );
  21.         lt = input.nextInt();
  22.  
  23.         while ( km != -1 ) // entra nel ciclo se l'utente non inserisce la sentinella -1
  24.         {
  25.             ++ contatore; // aumento di 1 il contatore
  26.             kmPercorsi = (double) km / lt; // calcolo i km percorsi
  27.             System.out.printf( "I Km/l percorsi con questo pieno sono %.2f\n", kmPercorsi); // visualizzo i km percorsi
  28.             totKm += km; // aggiungo i km al totale dei km
  29.             totLt += lt; // aggiungo i lt al totale dei lt
  30.             totKmPercorsi = (double) totKm / totLt; // calcolo il totale dei km percorsi
  31.             System.out.printf( "I Km/l percorsi con %d pieni sono %.2f\n", contatore, totKmPercorsi); // visualizzo il totale dei km percorsi
  32.             // chiedo all'utente di inserire i dati e li memorizzo nelle variabili
  33.             System.out.println( "Inserisci i dati del pieno:" );
  34.             System.out.print( "Inserisci i Km (-1 per uscire): " );
  35.             km = input.nextInt();
  36.             System.out.print( "Inserisci i lt: " );
  37.             lt = input.nextInt();
  38.         } // fine di while
  39.        
  40.         if ( contatore == 0 ) //controllo che sia stato inserito almeno un pieno
  41.             System.out.println( "Non hai inserito nessun pieno" );
  42.     } // fine metodo calcolaMedia
  43. } // fine classe Kilometri



questa è la main
Codice sorgente - presumibilmente Java

  1. public class ProvaKilometri
  2. {
  3.     public static void main( String args[] )
  4.     {
  5.         Kilometri kilometri1 = new Kilometri(); // creo l'oggetto
  6.         kilometri1.calcolaMedia(); // chiamata al metodo
  7.     } // fine di main
  8. } // 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

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 20:50
Giovedì, 28/01/2010
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 il 28/01/2010 alle 20:55
PM Quote
Avatar
zerg (Normal User)
Rookie


Messaggi: 48
Iscritto: 13/11/2009

Segnala al moderatore
Postato alle 8:26
Venerdì, 29/01/2010
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

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 13:18
Venerdì, 29/01/2010
postami eventualmente la traccia completa dell'esercizio, così se hai altri problemi posso guidarti preparandola magari prima e fornendotela a pezzi quando ti blocchi.

PM Quote
Avatar
zerg (Normal User)
Rookie


Messaggi: 48
Iscritto: 13/11/2009

Segnala al moderatore
Postato alle 11:16
Domenica, 31/01/2010
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 il 31/01/2010 alle 11:18
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 14:07
Domenica, 31/01/2010
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.

PM Quote
Avatar
zerg (Normal User)
Rookie


Messaggi: 48
Iscritto: 13/11/2009

Segnala al moderatore
Postato alle 14:14
Lunedì, 01/02/2010
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 il 01/02/2010 alle 15:42
PM Quote
Avatar
zerg (Normal User)
Rookie


Messaggi: 48
Iscritto: 13/11/2009

Segnala al moderatore
Postato alle 17:00
Lunedì, 01/02/2010
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

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 20:21
Lunedì, 01/02/2010
si, come avrai già letto nella OOP c'è l'incapsulamento, ereditarietà e polimorfismo, le ultime due cose tienile in sospeso approfondirai più avanti.

l'incapsulamento era già presente nella strutturata quindi dovrebbe esserti familiare, praticamente devi "nascondere" i dati grezzi al codice utente, e renderlo accessibile tramite codice controllato dalla classe che espone quei dati, per implementare la così detta "programmazione per contratto", vale a dire verificare i dati in input quando setti, e verificati i dati di output quando elabori, se non si fosse l'incapsulamento con i metodi getQualcosa e setQualcosa il codice utente avrebbe diretto accesso a un semplice intero per dire e i contrilli sarebbero a lui delagati (delegati si intende al codice utente, e questo romberebbe quel discorso sulle responsabilità di prima, se la classe X è responsabile a portare a termine determinati lavori su determinati dati, è anche responsabile di verificare che l'input e l'output siano corretti, chi userà la classe non dovrà essere responsabile di questo).

In altri linguaggi al posto dei metodi get e set si implementano ad esempio le proprietà molto simili alla logica che c'era in vb6.

Ultima modifica effettuata da netarrow il 01/02/2010 alle 20:22
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo