Warunek w warunku, różne typy danych

0

Witam,
chciałam za pomocą operatora trójargumentowego rozwiązać proste równanie liniowe. Zapisałam to zdaje się poprawnie:

String test  = (a==0 && c==b) ? "NWR" : ((a==0 && c!=b) ? "BR" : "nie wiem jeszcze") ;
System.out.println(test);

Zamiast "nie wiem jeszcze" powinno być oczywiście rozwiązanie równania: (c-b)/a, jednak nie potrafię włączyć tu typu double dla takiego rozwiązania. Jak należy to zrobić ?

0
  1. a,b i c już powinni być typu doube
  2. zawsze możesz zapisać: (doube)(c-b)/a
  3. ma sens nie powtarzać warunku: String test=a==0?(c==b?"NWR":"BR"):Double.toString((c-b)/a);
0

Są wcześniej tak zadeklarowane, tyle, że przy zmiennej test zadeklarowałam String, w związku z czym nie przyjmuje mi innej opcji. Otrzymuję komunikat: bad type in conditional expression, double cannot be converted to String. W tym właśnie problem, że nie wiem jak to zapisać, aby przy jednym warunku wypisało komunikat, a przy innym wyliczało wartość, również wypisując ją na ekran.

0

Próbowałam wcześniej czegoś w ten deseń, ale o ile dobrze to rozumiem, nie przyjmuje takiego rodzaju rozwiązania jak obliczenie wartości, więc wyrzucenie tego na ekran zamieniając double na string to sprawa drugorzędna, gdyż jak wspomniałam ostatni fragment

String test  = (a==0 && c==b) ? "NWR" : ((a==0 && c!=b) ? "BR" : (c-b)/a) ;

nie jest akceptowalny.

0

Dziękuję, pomogło :)

A jak ten wynik mogę zaokrąglić do 2 miejsc po przecinku ? wcześniej stosowałam taki zapis:

c*=100;
 c=Math.round(c);
 c/=100;

ale dla liczb wpisywanych przez użytkownika, nawet jeśli przed zadeklarowaniem warunków przypisałam do obliczeń x, nie hula:

double x = (c-b)/a;
    x*=100;
    x=Math.round(x);
    x/=100;
String test  = (a==0 && c==b) ? "NWR" : ((a==0 && c!=b) ? "BR" : x.toString() ;

Mój błąd, hula, błędny zapis był,

String test  = (a==0 && c==b) ? "NWR" : ((a==0 && c!=b) ? "BR" : x).toString();

Ale pytania rodzą się nowe... ;)
załóżmy, że dla true zamiast "BR" jak jest w ostatnim nawiasie również chciałabym dokonać jakiegoś obliczenia np. c-b
.toString() było wcześniej dopisane po całym nawiasie, w którym były i Stringi i wyliczenie (wymyśliłam, że może dotyczyć wszystkiego co w tym nawiasie należy przerobić na Stringa), ale taki zapis nie jest poprawny

String test  = (a==0 && c==b) ? "NWR" : ((a==0 && c!=b) ? c-b : x).toString();

Próba oddzielnego zapisu do każdego z działań również wykazuje błąd:

String test  = (a==0 && c==b) ? "NWR" : ((a==0 && c!=b) ? (c-b).toString() : x).toString();
String test  = (a==0 && c==b) ? "NWR" : ((a==0 && c!=b) ? (c-b).toString() : x.toString());

Jaka jest jeszcze opcja, poprawna ?

0

To już podchodzi pod fetysz, wiesz? :P

String test  = (a==0 && c==b) ? "NWR" : (a==0 && c!=b) ? String.valueOf(c-b) : String.valueOf(x);
0

Brzmi nieźle, ale to nie to ;p z której strony się nie zabiorę same pytania ;) dzięki

0

Jedna uwaga @wiedzma, nie pisz kodu w ten sposób, bo sama sobie robisz problemy. Jeżeli rozbiła byś tą jedną linię na kilka, ale takich gdzie w jednej linii masz jedną operację szybciej byś wyłapała błąd.

0

Na potwierdzenie tego co napisał @Koziołek:

if(a!=0) { /* normalne kwadratowe */ }
else if(b!=0) { /* b/c */ }
else if(c!=0) { /* brak rozwiązań */ }
else { /* dowolne rozwiązanie */ }
0

Rozumiem, tyle, że zależało mi, aby przyswoić operator trójargumentowy, zapis pętli jest naturalnie bardziej przystępny ;) jednak rozbijając to co wypisałam jako warunki w 1 linii tworzy się dopiero prawdziwy chaos.

1

Nie tworzy się chaos. Tworzy się kod czytelny. Zresztą wróć do tego kodu za miesiąc czy dwa. Będziesz potrzebować chwili by dojść co tam się naprawdę dzieje.

Zresztą może trochę na boku, ale mój faworyt pokazujący o co chodzi:

     q'Sh         ELoV
   eSMeshEl     OvEsmeNO
  tsHeloVeSM   EShELOVESm
 eNOTShEloVes mESheLovesMe
noTsHELovEsMESHelOVeSmEnotS
HeLOVeSMESHElOvESMENotSHeLo
 VesmEShELovEsmENOTsHELOVE
  smEsHELOveSMeNoTshELOVe
   SmesHElOVesmEnOTSheLO
    vEsMeshELoVESmEnoTS
     HELOvEsM'=~/(((\w
      )\W*(?{$^R.(0+(
       q{a}lt$3))}))
        {8}(?{print
         +pack"B8"
          ,$^Rand
           ""}))
            +/x

kod jest "jednolinijkowcem" nawet ładnie sformatowanym...

0
String test  = (a==0 && c==b) ? 
"NWR" : ((a==0 && c!=b) ? 
"BR" : x).toString();

że tak lepiej ?

Tak też mi się wydawało ;) zatem chyba jeszcze nie wiem jak to zrobić, aby był czytelny, a nie tylko pocięty.

0

Nie. Ponieważ nadal kod jest zagmatwany. To, że dodałaś spacje niczego nie zmieniło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1