Problem z prostym programem

0

Witam :)
otóż na ostatnich zajęciach zabraliśmy się za jave. Mam do napisania program, który : pobierze od użytkownika wartości zmiennych a,b,c trójmianu kwadratowego i poda ile dana funkcja posiada pierwiastków.
I mój problem polega na tym, iż nie wiem za bardzo jak połączyć pobrane od użytkownika dane z pierwszą częścią kodu gdzie są rozpisane warunki dla tej funkcji.

import javax.swing.JOptionPane;
public class MK {
	public static int iloscPierwiastków (double a , double b, double c){
		if(a!=0){
			double delta = b*b-4*a*c;
			if(delta <0){
				return 0;
			}else{
				if(delta==0){
					return 1;
				}else{
					return 2;
				}
			}
		}else{
			if(b!=0){
				return 1;
			}else {
				return 0;
			}
		}
	}
	public static void main(String[] args){
		String tekst;
		JOptionPane.showMessageDialog(null,
			"Witaj w programie, ktory obliczy liczbe pierwiastkow trojmianu kwadratowego \n dla dowolnie podanych a,b,c",
			"Powitanie",
			JOptionPane.INFORMATION_MESSAGE);
		tekst = JOptionPane.showInputDialog(null,
			"Uzupelnij: a = ",
			"Wprowadzanie danych",
			JOptionPane.QUESTION_MESSAGE);
		tekst = JOptionPane.showInputDialog(null,
			"Uzupelnij: b = ",
			"Wprowadzanie danych",
			JOptionPane.QUESTION_MESSAGE);
		tekst = JOptionPane.showInputDialog(null,
			"Uzupelnij: c = ",
			"Wprowadzanie danych",
			JOptionPane.QUESTION_MESSAGE);
		
	}
}

Będę wdzięczna za wszelkie wskazówki :)

0
         boolean ok:=true;
         double a=0.0;
         tekst = JOptionPane.showInputDialog(null,
                    "Uzupelnij: a = ",
                    "Wprowadzanie danych",
                     JOptionPane.QUESTION_MESSAGE);
         if(tekst==null) //użytkownik wybrał Cancel
         {
                ok=false;
         }
         else
         {
                try
               {
                      a=Integer.parseInt(tekst);
               }
               catch(Exception e)
               {
                      ok=false; //użytkownik wpisał głupoty
               }
         }
         if(!ok)
             // kończymy program
        else
            // w podobny sposób pytamy o b oraz c
0

Pomyłka [glowa] , ma by

   a=Double.parseDouble(tekst);
0

A może być coś takiego :

import javax.swing.JOptionPane;
public class MK {
	public static int iloscPierwiastków (double a , double b, double c){
		if(a!=0){
			double delta = b*b-4*a*c;
			if(delta <0){
				return 0;
			}else{
				if(delta==0){
					return 1;
				}else{
					return 2;
				}
			}
		}else{
			if(b!=0){
				return 1;
			}else {
				return 0;
			}
		}
	}

public static void main(String [] args) {
	String tekst;
	JOptionPane.showMessageDialog(null,
		"Witaj w programie, ktory wylicza liczbe pierwiastkow \n trojmianu kwadratowego ax^2+bx+c dla dowolnie podanych a,b,c",
		"Powitanie",
		JOptionPane.INFORMATION_MESSAGE);
	tekst = JOptionPane.showInputDialog(null,
		" Uzupelnij a = ",
		"Wprowadzanie danych",
		JOptionPane.QUESTION_MESSAGE);
	double a = Double.parseDouble(tekst);
	tekst = JOptionPane.showInputDialog(null,
		" Uzupelnij b = ",
		"Wprowadzanie danych",
		JOptionPane.QUESTION_MESSAGE);
	double b = Double.parseDouble(tekst);
	tekst = JOptionPane.showInputDialog(null,
		" Uzupelnij c = ",
		"Wprowadzanie danych",
		JOptionPane.QUESTION_MESSAGE);
	double c = Double.parseDouble(tekst);
	
	
}
}

Bo z tymi warunkami trochę się pogubiłam :) I teraz potrzebuję czegoś co połączy mi warunki z uzyskanymi danymi ..

Z góry przepraszam, że tak męczę ale miałam dopiero 1 zajęcia z javy i nie do końca jeszcze wszystko pojmuję ;)

0

Może tak:

import javax.swing.JOptionPane;
public class MK 
{
        public static int iloscPierwiastków (double a , double b, double c)
        {
                if(a!=0)
                {
                        double delta = b*b-4*a*c;
                        if(delta <0)
                        {
                                return 0;
                        }
                        else
                        {
                                if(delta==0)
                                {
                                        return 1;
                                }
                                else
                                {
                                        return 2;
                                }
                        }
                }
                else
                {
                        if(b!=0)
                        {
                                return 1;
                        }
                        else 
                        {
                                return 0;
                        }
                }
        }

        public static void main(String [] args)
        {
             String tekst;
             boolean ok=true;
             double a=0.0;
             tekst = JOptionPane.showInputDialog(null,
                    "Uzupelnij: a = ",
                    "Wprowadzanie danych",
                     JOptionPane.QUESTION_MESSAGE);
             if(tekst==null)
             {
                  ok=false;
             }
             else
             {
                  try
                  {
                       a=Double.parseDouble(tekst);
                  }
                  catch(Exception e)
                  {
                       ok=false;
                  }
             }
             if(!ok)
             {
                 JOptionPane.showMessageDialog(null,
                                               "To nie jest liczba","Poważne ostrzeżenie",
                                               JOptionPane.INFORMATION_MESSAGE);
                 System.exit(0);
             }
             ok=true;
             double b=0.0;
             tekst = JOptionPane.showInputDialog(null,
                    "Uzupelnij: b = ",
                    "Wprowadzanie danych",
                     JOptionPane.QUESTION_MESSAGE);
             if(tekst==null)
             {
                  ok=false;
             }
             else
             {
                  try
                  {
                        b=Double.parseDouble(tekst);
                  }
                  catch(Exception e)
                  {
                        ok=false;
                  }
            }
            if(!ok)
            {
                 JOptionPane.showMessageDialog(null,
                                               "To nie jest liczba","Poważne ostrzeżenie",
                                               JOptionPane.INFORMATION_MESSAGE);
                 System.exit(0);
            }
            ok=true;
            double c=0.0;
            tekst = JOptionPane.showInputDialog(null,
                    "Uzupelnij: c = ",
                    "Wprowadzanie danych",
                     JOptionPane.QUESTION_MESSAGE);
            if(tekst==null)
            {
                 ok=false;
            }
            else
            {
                 try
                 {
                       c=Double.parseDouble(tekst);
                 }
                 catch(Exception e)
                 {
                      ok=false;
                 }
           }
           if(!ok)
           {
               JOptionPane.showMessageDialog(null,
                                               "To nie jest liczba","Poważne ostrzeżenie",
                                               JOptionPane.INFORMATION_MESSAGE);
               System.exit(0);
           }
           JOptionPane.showMessageDialog(null,
                                               "Ilość pierwiastków równania: "+iloscPierwiastków(a,b,c),"",
                                               JOptionPane.INFORMATION_MESSAGE);
           System.exit(0);
       }
}

Ja bym napisał funkcję czytająca liczbę typu double i wywołał ją trzy razy, kod byłby krótszy i czytelniejszy.
Porównania typu if(delta==0) są (zaokrąglenia) ryzykowne, możesz otrzymać true mimo, że liczby są różne.

0

Dzięki wielkie za pomoc :)
Teraz mniej wiecej juz rozumiem o co chodzi w poprawnym kodowaniu ;]
Dzieki :)

1

Dodam tylko, że nie należy porównywać liczb zmiennoprzecinkowych z zerem (0f) ponieważ błędy zaokrągleń spowodują, że uzyskanie zera będzie niemal niemożliwe. Trzeba ustalić sobie arbitralnie akceptowalny błąd dokładności i wtedy porównywać czy testowana wartość jest bezwzględnie mniejsza od tego błędu. np. if( abs(wartosc) < epsilon ) System.out.println("ZERO"); Epsilon byłby tu wielkością błędu (np. double epsilon = 0.00001). Tak samo testowanie różnicy między dwoma wartościami: if ( abs(a - b) < epsilon ) ...
Gdyby okazało się, że delta wyjdzie w założonej dokładności blisko zera, to należałoby policzyć punkt styku (pierwiastek), a uzyskaną wartość trzeba by podstawić pod wynik funkcji w tym punkcie. Jeżeli wynik funkcji też znalazłby się w pobliżu wartości zero czyli byłby bezwzględnie mniejszy od wartości epsilon, to wtedy można by jednoznacznie odpowiedzieć, że funkcja kwadratowa ma jeden pierwiastek. W przeciwnym wypadku może mieć dwa lub wcale.

W kodzie powyżej bez użycia wielkości tolerowanego błędu sytuacja uzyskania pojedynczego pierwiastka będzie niezwykle rzadka lub prawie niemożliwa nawet dla danych, które powinny dać tylko jeden pierwiastek z obliczeń w pamięci - np.:
Dla f(y) = a * pow((x - p), 2) + 0 [punkt zerowy w (p,0)],
gdzie p = -b / (2 * a) konieczne byłoby wymaganie aby a * (x + (b / (2 * a)) * a * (x + (b / (2 * a)) lub inaczej
a * (x - p) * (x - p) dało w wyniku dokładnie liczbę 0f.

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