2015-12-01 11 views
13

E 'come segue:Java: cosa mi sta chiedendo di fare?

ho messo in evidenza la parte che non capisco. Cosa significa esattamente quando mi sta chiedendo di fare in modo che quei metodi accettino solo due parametri? Sembra che tu abbia bisogno di 3, quali sono i punteggi dei test per ciascun test?

Il codice che ho finora:

public class Student { 

private String ID; 
private double test1; 
private double test2; 
private double test3; 
private double average; 

public Student(String sID, double sTest1, double sTest2, double sTest3, double sAverage) 
{ 
    ID = sID; 
    test1 = sTest1; 
    test2 = sTest2; 
    test3 = sTest3; 
    average = sAverage; 
} 

public Student(String sID) 
{ 
    ID = sID; 
} 

public void setTestScore(double sTest1, double sTest2, double sTest3) 
{ 

} 

public void getTestScore(double sTest1, double sTest2, double sTest3) 
{ 

} 

public double calcAverage() 
{ 
    average = (test1 + test2 + test3)/3; 
    return average; 
} 

public void displayInfo(String ID, double test1, double test2, double test3, double average) 
{ 
    System.out.println("Student ID: " + ID); 
    System.out.println("Test 1 Score: " + test1); 
    System.out.println("Test 2 Score: " + test2); 
    System.out.println("Test 3 Score: " + test3); 
    System.out.println("Average test score: " + average); 
} 
} 

Tutta la comprensione di ciò che mi aspetta a che fare con i metodi getTestScore e setTestScore sarebbe apprezzato.

Modifica: Sembra che la soluzione sia utilizzare semplicemente una matrice per memorizzare i valori? Pensavo che avrebbe vanificato lo scopo di strutturarlo in questo modo ma sembra che come principiante le mie opzioni siano un po 'limitate.

+1

Oltre alle buone risposte già realtive di seguito, è necessario evitare nomi come "sTest1", "sTest2", "sTest3" e così via. Prova ad usare i nomi parlanti. Cosa contiene in realtà questo parametro? Non abbiate paura di usare nomi di suoni più lunghi per il vostro codice in quanto aiuta a capire cosa è cosa e aiuta anche se dovete lavorare su questo codice in un secondo momento. –

+0

Hai perfettamente ragione, non so perché lo faccio ancora a volte ma grazie per averlo fatto notare. – BaloneyOs

+0

la parte di modifica dovrebbe essere un commento! –

risposta

26

Che cosa significa esattamente quando mi sta chiedendo di fare in modo che quei metodi accettino solo due parametri? Sembra che tu abbia bisogno di 3, quali sono i punteggi dei test per ciascun test?

Questo sarebbe un modo per farlo, ma vogliono farlo leggermente in modo diverso.

Vogliono avere un metodo che imposta il punteggio solo per un singolo test.

Questo è probabilmente meglio come

  1. può essere adattato facilmente a un maggior numero di test

  2. permette di impostare i punteggi uno per uno (come si può anche non conoscere il altri punteggi ancora).

Quindi il parametro "extra" specifica quale test si sta parlando qui.

Per impostare tutti e tre i punteggi, chiamare questo metodo tre volte (con parametri diversi).

+1

Questo ha senso! Tuttavia, sono ancora incappato nel codice perché non ho ancora imparato come corrispondere una stringa (test1, test2, ecc.) Con un int (il parametro numero di test). In altre parole, non sono sicuro di come sia possibile eseguire questa parte senza utilizzare un array (forse?) O una serie di istruzioni if ​​e capisco che l'utilizzo di questi potrebbe vanificare lo scopo di formattarlo in questo modo. – BaloneyOs

+0

Sì, usa un array (quelli che hanno "chiavi" int) o una mappa (può anche avere chiavi int, o in qualche modo trasformarli in una stringa come "test1" --- ma perché?) – Thilo

11

Il metodo set non dovrebbe accettare tutti i 3 punteggi in una volta. Dovrebbe accettare un parametro a punteggio singolo e un secondo parametro (int il cui valore è compreso tra 1 e 3) per indicare quale punteggio del test deve essere aggiornato.

Analogamente, il metodo get deve accettare il numero di test (tra 1 e 3) e restituire il punteggio corrispondente.

15

Setter dovrebbe avere 2 parametri: il numero di test e segnare

public void setTestScore(int testNo, double score) { 
    //YOUR HOMEWORK 
} 

Getter deve restituire il punteggio per il numero di test

public double getTestScore(int testNo) { 
    return YOUR_HOMEWORK; 
} 

tuo Assegnazione in questo caso è quello di pensare ad un buon struttura dei dati per contenere i risultati di un numero di test (attualmente tre) e recuperarli in un secondo momento.

Suggerimento: come altri qui hanno già suggerito, si potrebbe pensare ad un datastructure per mappa valori chiave (il tuo numero di test) per i valori (il tuo punteggio). Il più fondamentale di queste strutture che sono un array in cui l'indice è la chiave (attenzione: con base zero) e il punteggio è il valore a tale indice ...

con array

si potrebbe ancora avere un modo di inizializzazione per specificare quanti test ci devono essere. Lascia per un attimo pensare a double[] scores = new double[3]; come variabile membro della tua classe. Impostare il 3 ° test su score sarebbe semplice come scores[2] = score;. Ottenere il risultato della prima prova è semplicemente scores[0];

+0

Conserva i dati in un array (l'unico vero modo in cui posso pensare di farlo anche a questo punto) vanifica lo scopo di strutturare il metodo in questo modo? È ancora certamente più facile che aggiungere una serie di affermazioni if, allo scopo di aggiungere altri test in futuro e così, forse è proprio questo l'intento. – BaloneyOs

+0

impostando il 3 ° test per segnare, vuoi dire? – Thilo

-5

Che cosa significa esattamente quando mi sta chiedendo di fare quei metodi accettano solo due parametri? Sembra che tu abbia bisogno di 3, che sono i punteggi dei test per ogni rispettivo test?

il metodo dovrebbe accettare di test-id e il test-score, e impostare i dati di attributo corretto,

public void setTestScore(int testNumber, double testScore) 
{ 
if(testNumber == 1) 
     test1=testScore; 
else if(testNumber == 2) 
     test2=testScore; 
else if(testNumber == 3) 
     test3=testScore; 
} 

e ottenere il metodo dovrebbe prendere 1 param (testNumber)

public double getTestScore(int testNumber){ 
if(testNumber == 1) 
     return test1; 
else if(testNumber == 2) 
     return test2; 
else if(testNumber == 3) 
     return test3; 
} 
+5

Funziona ma sta insegnando uno stile di codifica davvero pessimo. –

+0

@Aron_dc so che l'OP può usare gli array per esempio ma ho scritto in base alla classe pubblicata da OP che contiene variabili diverse per ogni risultato, alcuni compiti educativi sono legati a ciò che sono stati difficili, quindi a volte NON POSSONO usare matrici (YET) – Yazan

0

I pensate che dovreste creare una mappa di qualche tipo, con l'ID del test come chiave e il punteggio come valore.

Il setter popolerà la mappa con il punteggio per l'ID di test corrente.

Il getter recupera il punteggio nella mappa, corrispondente all'ID di test richiesto.

+0

Motivo del downvote: "I think ..." – Krythic

1

Idealmente si vorrebbe avere tutto orientato agli oggetti, ciò significherebbe che il Test stesso sarebbe la propria classe.

Penso che ci si aspetta che il primo valore sia il numero del test (da 1 a 3) e il secondo valore sia il valore reale. Quindi la firma del metodo che hai è sbagliata. Dovrebbe avere solo due paramter. Il primo è il numero e il secondo è il punteggio.

Cosa succede dopo che il setter è stato chiamato?

Bene ... devi decidere su qualche struttura per memorizzare quei dati. Sono fondamentalmente tre coppie di dati. Come ho detto prima, sarebbe bello avere una classe di test, ma una semplice struttura dati dovrebbe essere sufficiente. Ti darò un suggerimento sulla struttura dei dati: dovrebbe essere basato su chiave/valore. La chiave è l'id del test e il valore è il valore del test. Leggi le raccolte java per vedere se c'è qualche tipo di struttura dati che può aiutarti con questo.

8

Il primo metodo dovrebbe aggiungere un test e un punteggio a una raccolta, diciamo uno HashMap<Integer, Double>.Come questo:

public void addScore(int testId, double score) { 
    myTestsMap.put(testId, score); 
} 

La seconda parte dovrebbe recuperare il punteggio dalla mappa, in questo modo:

public double getScoreForTest(int testId) { 
    if(myTestsMap.containsKey(testId){ 
     return myTestsMap.get(testId); 
    } else { 
     return -1; 
    } 
} 

myTestsMap dovrebbe essere un campo di classe così è stato è tenuto. Creare nel costruttore del genere:

myTestsMap = new HashMap<Integer, Double>; 

Come per un background teorico:

i due metodi sono i cosiddetti getter e setter. È buona norma mantenere i campi della classe privati ​​ e consentire l'accesso solo tramite tali metodi. Permette di analizzare i dati in entrata e in uscita, tra le altre cose.

Mappa è una struttura dati che associa un insieme di chiavi univoche a valori non univoci. HashMap è una delle implementazioni di Map.

+0

perché testid sarebbe un double? –

+0

L'OP usa il doppio del suo codice, ma hai ragione, potrebbe anche essere un numero intero :-) – Kelevandos

+0

Sembra un buon riferimento per il futuro, ma per ora sembra un po 'oltre ciò che ho imparato. Apprezzo comunque l'aiuto! – BaloneyOs

5

Un'altra opzione non menzionati qui è quello di tenere i vostri punteggi dei test in un ArrayList:

public class Student { 
    private String ID; 
    private ArrayList<Double> testScores = new ArrayList<>(); 

    //CONSTRUCTOR 

    public void setTestScore(int testNumber, double score) { 
     //YOUR HOMEWORK 
    } 

    public double getTestScore(int testNumber) { 
     //YOUR HOMEWORK 
    } 

Ora puoi aggiungere la tua punteggi dei test e possono essere posizionale sulla base dell'indice nella lista. Notare che ArrayList è anch'esso a 0, quindi dovrai correggerlo. Questo approccio offre anche l'ulteriore vantaggio di poter iterare attraverso i punteggi dei test e stamparli nell'ordine corretto.

2

Che cosa significa esattamente quando mi sta chiedendo di fare in modo che quei metodi accettino solo due parametri? Sembra che tu abbia bisogno di 3, quali sono i punteggi dei test per ciascun test?

Provate a pensare a cosa dovrebbe fare il metodo, piuttosto che a come lo fareste. Il nome del metodo è un giveaway - setTestScore. Ciò mi indicherebbe, che voglio impostare il punteggio per un singolo test.

Ora, mi chiedo, quali informazioni avrei bisogno di modificare il punteggio per un singolo test? Avrei bisogno di qualcosa che identifichi un singolo test. E.g il numero intero 0 per il test 1, intero 1 per il test 2, ecc. Avrei anche bisogno del punteggio effettivo del test, in modo che possa memorizzarlo. Ora so che probabilmente ho bisogno di due parametri, uno per l'identificatore del test e uno per il punteggio del test.

Quindi ora ho bisogno di un modo per memorizzare il punteggio del test in un posto specifico usando l'identificatore. Dato che ho un identificatore che è un numero intero, dovrebbe essere chiaro che vorrei usare un array. La ragione per cui scegliere un array è perché accetta un intero e mi consente di accedere ai dati in quel punto dell'array.

Una sezione di pseudocodice per evidenziare ciò che ho proposto in precedenza:

setTestScore (parameter1 testIdentifier, parameter2 testScore) 
ArrayOfTestScores[testIdentifier] = testScore 

Nota quanto riguarda la tua seconda domanda

Sembra che si avrebbe bisogno di 3, che sono i punteggi dei test per ogni rispettivo test ?

Se qualcuno vi ha inviato le seguenti informazioni in una e-mail, e ti ha chiesto di memorizzare/aggiornare il valore per il test di uno studente in un foglio di Excel:

  • alcun valore
  • 65,7
  • senza valore

Certo, è possibile vedere subito è necessario aggiornare il secondo test dello studente. Ma, c'è un modo migliore? E la persona che mi ha appena mandato il numero del test e il punteggio?

Test 2: 65,7

sembra essere più facile, perché ho un identificatore effettivo per il test da aggiornare. E inoltre non ho bisogno di informazioni ridondanti nell'e-mail.

Quando si inizia con la programmazione, può essere utile provare a trasformare il problema in un esempio di vita reale a cui si può eventualmente contare. Potrebbe aiutarti a capire cosa ha senso e cosa no. Alla fine, poiché i problemi diventano più complicati, probabilmente dovrai apprendere alcuni approcci formali alla risoluzione dei problemi. Ma per questo esempio, rendere semplice una vita reale equivalente a quello che stai facendo può essere d'aiuto.

2

L'oggetto studente deve avere un campo Map<Integer, Double> che memorizza il numero di test come chiave e il punteggio ottenuto su tale test come valore. Il metodo set sarà put(testNumber, score) e il metodo get restituirà il punteggio del test per get(testNumber);

Ciò che sembra confuso è forse il requisito di fornire un costruttore che imposta tutti i campi? Forse ti aspetti che la firma del metodo del costruttore appaia come il metodo setTestScore?

Se hai ancora bisogno di aiuto, prova a riflettere un attimo su di cosa tratta la lezione. Stai imparando sulle collezioni?

Problemi correlati