Guida ai numeri complessi

-1

OK, quindi ho un incarico di programmazione e ho bisogno di creare una classe che rappresenti i numeri complessi (buona finora), aggiungerli a una lista (buona finora), e quindi mostrare se ogni singolo numero è reale (a + 0x), immaginario (0 + bx) o complesso (a + bx). Un oggetto Complesso viene creato inizializzando la porzione reale e la parte immaginaria

    Complex(int _real, int _imag) { real = _real; imag = _imag; };
    Complex(int _real) {real = _real; imag = 0;};
    Complex() { real, imag = 0;}

Il problema è che il mio professore ha stipulazioni sciocche come tutti i campi dati devono essere privati e non ci possono essere metodi per accedere a qualsiasi porzione di un numero complesso indivdual al di fuori della classe.

Invece gli unici metodi pubblici con cui lavorare sono i metodi plus, sottrazione e moltiplicazione che prendono un altro numero complesso e restituiscono una somma, differenza e prodotto dei due rispettivamente e un metodo coniugato che restituisce il coniugato di un singolo complesso. Con solo questi quattro metodi pubblici a mia disposizione, quale formula posso usare per calcolare se un numero individuale è reale, immaginario o complesso?

Questo è meno un problema di codifica e più un problema logico che conosco.

    
posta RudolphRedNose 07.03.2015 - 01:13
fonte

3 risposte

5

Lascia che c = a + bi e q siano il coniugato di c .

Quindi c + q = 2a e c - q = 2bi . Ora hai isolato il doppio delle parti reali e immaginarie.

Se il tuo professore ti permette di avere un metodo equals , puoi confrontarli a zero (cioè Complex(0, 0) ) e hai le tue risposte.

Se puoi letteralmente utilizzare solo i quattro metodi che hai citato (addizione, sottrazione, moltiplicazione e coniugazione), determinare la tua risposta è probabilmente impossibile.

    
risposta data 07.03.2015 - 02:02
fonte
0

Nota: questo è un hack e non il modo in cui il codice "reale" (ha-ha) dovrebbe essere scritto

Come Bogie ha detto a Bergman, "Avremo sempre toString ()".

Dati i parametri eccessivamente restrittivi forniti dall'OP, l'unica soluzione che posso pensare è inserire le informazioni nel metodo toString (). Senza pensare seriamente a un buon codice o test, qualcosa come:

public String toString() {
   StringBuilder sb = new StringBuilder();
   sb.append(this.real);
   sb.append( (this.imag >= 0.0) ? " +" : " ");
   sb.append(this.imag);
   if (this.real == 0.0) {
      if (this.imag != 0.0) 
         sb.append("   imaginary");
   }
   else {
      sb.append( (this.imag == 0.0) ? "   real" : "   complex");
   }

   // TODO  note : not sure what 0.0, 0.0 counts as...

   return sb.toString();
}

Questo è più di un "accidenti, sono intelligente Google Interview Answer". Nella vita reale chiedi al tuo professore (o al tuo stakeholder) che cosa diavolo vogliono veramente.

P.S. Nota che i miei confronti diretti a 0.0 sono dubbi, probabilmente vorrai testare se il valore assoluto è inferiore a un epsilon piccolo.

    
risposta data 07.03.2015 - 02:33
fonte
-1

< modifica > Penso che tu abbia frainteso l'intento del tuo professore. Una classe numerica complessa senza alcun modo per accedere ai valori interni sarebbe inutile. Mi aspetterei getRealPart () e getImaginaryPart () sarebbe implementato, e getMagnitude () e getAngle () pure. Per quanto riguarda il down-voter, qual è esattamente la tua preoccupazione? < / modifica >

Probabilmente il tuo professore ti sta indirizzando verso il rendere la tua classe Complex immutabile. Dai un'occhiata alla classe BigDecimal: utilizza questo modello

Non dimenticare che in un metodo membro come con una firma come Complemento complesso (Complesso x) puoi accedere direttamente ai campi di x - non hai bisogno di getter, come le regole di accesso di Java consentono l'accesso.

Non sono sicuro del motivo per cui devi testare per reale, immaginario o complesso. Se hai bisogno di un metodo membro isReal (), prova la parte immaginaria a zero.

La tua classe avrà un metodo equals (), poiché è un metodo di tutti gli oggetti Java. Dovrai sovrascriverlo e dovresti anche eseguire l'override di hashCode () mentre sei nell'area.

    
risposta data 07.03.2015 - 06:40
fonte

Leggi altre domande sui tag