Równanie kwadratowe w Java

0

Witam, mam problem, którego za cholerę nie potrafię rozwiązać. Pragnę was poinformować, że dopiero raczkuję w Java.
A więc, w kodzie, w pętli np. w pętli while(repeat1) mam zmienną double a,

KOD:

System.out.println("Podaj parametry równania kwadratowego");

    boolean repeat1 = true; //zmmienna typu Boolean. Wartości logiczne są dwie: true i false.
    
    while(repeat1)          
    {
        try 
        {
            Scanner kawdrat1 = new Scanner(System.in);
    
            System.out.println("A = ");
            
        double a = kawdrat1.nextDouble();//
            System.out.println("A równa się " + a);
            System.out.println();
            repeat1 = false;
        }
        
        catch (InputMismatchException e) 
        {
                System.out.println("Błąd "+ imie + "... Wprowadziłeś niepoprawne dane!"
                                 + " Wprowadz dane ponownie!");
        }    
    }

Jak widać program zabezpieczyłem przed wywaleniem błędu, spowodowanym wprowadzaniem wartości zmiennej typu char lub String,
i to jest dobrze, ale następnie chcę tej zmiennej użyć do dalszych obliczeń, ale to nie funkcjonuje tak jak bym tego chciał.

O to kod:

double dzialanie;

        dzialanie = b*b-4*a*c; 
        
    if (dzialanie>0) 
    {
        dzialanie = sqrt(dzialanie);
        double x1;
        x1 = (-b - dzialanie)/(2*a);
        
        double x2;
        x2 = (-b + dzialanie)/(2*a);
        
        System.out.println();
        System.out.println(imie +", Twoje obliczone pierwiastki to:\nX1= " +x1+ "\nX2= " +x2);
    }

I jak widać program nie ładuje zmiennej double a, podanej przez użytkownika do tego działania... I moje pytanie dlaczego, i jak to naprawić??
Proszę Was o pomoc, szukałem w necie informacji, ale jakoś nie potrafię tego rozwiązać..

0

Jeżeli tworzysz zmienną w klamrach to tylko tam będzie ona widoczna. Mowa o klamrach w try.

Ten komentarz zasługuje na nagrodę:

boolean repeat1 = true; //zmmienna typu Boolean. Wartości logiczne są dwie: true i false.

Jeżeli potrzebujesz skomentować kod to oznacza to że nazwy zmiennych oraz metod są złe. Polecam książkę Czysty Kod

0

Teraz umieściłem ją przed boolean repeat1 = true; i to teraz działa, ale znowu zabezpieczenie przed wprowadzeniem np. wartości zmiennej char nie funkcjonuje...

Jak to napisać, aby jedno z drugim działało??

package rownaniekwadratowe;

/**
*

import java.util.Scanner;
import static java.lang.Math.*;
import java.util.InputMismatchException;

public class RownanieKwadratowe
{

public static void main(String[] args)
{           
    
System.out.println("Podaj swoje imię"); 
Scanner pobieraImie = new Scanner(System.in);
String imie = pobieraImie.nextLine();

System.out.println();

    System.out.println("Witaj "+ imie +", dzięki temu programowi"
                     + "\nmożemy wyznaczyć równanie kwadratowe,"
                     + "\ngdzie a, b oraz c, są podawane przez użytkowanika.");
    
    System.out.println();
    
    System.out.println("Podaj parametry równania kwadratowego");
    
   ** Scanner kawdrat1 = new Scanner(System.in);
    System.out.println("A = ");     
    double a = kawdrat1.nextDouble();**
    
    

boolean repeat1 = true;

while(repeat1)
{
try
{
System.out.println("A równa się " + a);
System.out.println();
repeat1 = false;
}

        catch (InputMismatchException e) 
        {
                System.out.println("Błąd "+ imie + "... Wprowadziłeś niepoprawne dane!"
                                 + "Wprowadz dane ponownie!");
        }    
    }        
    Scanner kawdrat2 = new Scanner(System.in);
    System.out.println("B = ")
double b = kawdrat2.nextDouble();
	
    boolean repeat2 = true;
    
    while(repeat2)
    {        
        try 
        {
            System.out.println("B równa się " + b);
	System.out.println();
            repeat2 = false;                
        }
        catch (InputMismatchException e)
        {
            System.out.println("Błąd "+ imie + "... Wprowadziłeś niepoprawne dane!"
                             + "Wprowadz dane ponownie!");
        }
        
    }     
    Scanner kawdrat3 = new Scanner(System.in); 
    System.out.println("C = ");
    double c = kawdrat3.nextDouble();
    
    boolean repeat3 = true;
    
    while(repeat3)
    {        
        try 
        {
            
	System.out.println("C równa się " + c);
	System.out.println();
            repeat3 = false;                
        }
        catch (InputMismatchException e)
        {
            System.out.println("Błąd "+ imie + "... Wprowadziłeś niepoprawne dane!"
                             + "Wprowadz dane ponownie!");
        }
        
    }
    
        double dzialanie; 
        
        dzialanie = b*b-4*a*c; 
        
    if (dzialanie>0) 
    {
        dzialanie = sqrt(dzialanie);
        double x1;
        x1 = (-b - dzialanie)/(2*a);
        
        double x2;
        x2 = (-b + dzialanie)/(2*a);
        
        System.out.println();
        System.out.println(imie +", Twoje obliczone pierwiastki to:\nX1= " +x1+ "\nX2= " +x2);
    }
    else if (dzialanie==0) 
    {
        double x3;
        x3 = -b/(2*a);
        System.out.println();
        System.out.println(imie +", Twój obliczony pierwiastek to = " + x3);    
    }
    else if(dzialanie<0)
    {
        System.out.println();
        System.out.println(imie +", brak pierwiastków rzeczywistych");    
    }
    
    System.out.println("Dziękuję Ci "+ imie + " za uwagę!");
   
}

}

0

Nie musisz tworzyć osobnego obiektu Scanner dla każdej zmiennej. Zrób sobie zmienną w main

Scanner scanner = new Scanner(System.in);

i z niego korzystaj.

Poza tym używaj sensownych nazw zmiennych, repeat1, repeat2 oraz repeat3 nikomu nic nie mówią. A nie działa dlatego że i tak ustawiasz flagę repeat na false w try'ach.

0

Napisałeś:

**A nie działa dlatego że i tak ustawiasz flagę repeat na false w try'ach.
**

Mógłbyś napisać jak to zrobić ?

Tak ustawiłem, ponieważ gdy napiszę do zmiennej **a **np. qwewe to powinno mi wyświetlić komunikat z catch, i ta pętla **while **powinna się powtórzyć...
tzn. ja tak myślę... ;/... ale na pewno się mylę i nie umiem tego przeskoczyć...

0

Pętla do wprowadzania danych powinna wyglądać tak:

/* Użycie do-while gwarantuje przynajmniej jednorazowe wykonanie się pętli */
boolean valid = true;
do {
	try {
		// Pobierasz dane
		valid = true;
	}
	catch (InputMismatchException ex) {
		// Wyświetlanie komunikatu błędu
		valid = false;
	}
} while(!valid);

Wrzuciłbym to do osobnej metody po to abyś nie powtarzał tego samego kodu za każdym razem kiedy pobierasz dane.

0

O super! Teraz to działa jak należy, ale dalej mam problem z tym jak załadować teraz wartości z a, b, c dalej do programu...

O w tym miejscu dokładnie:

double dzialanie;

        dzialanie = b*b-4*a*c;  
        
    if (dzialanie>0) 
    {
        dzialanie = sqrt(dzialanie); 
        double x1;
        x1 = (-b - dzialanie)/(2*a);
        
        double x2;
        x2 = (-b + dzialanie)/(2*a);
        
        System.out.println();
        System.out.println(imie +", Twoje obliczone pierwiastki to:\nX1= " +x1+ "\nX2= " +x2);
    }
    else if (dzialanie==0) 
    {
        double x3;
        x3 = -b/(2*a);
        System.out.println();
        System.out.println(imie +", Twój obliczony pierwiastek to = " + x3);    
    }
    else if(dzialanie<0) 
    {
        System.out.println();
        System.out.println(imie +", brak pierwiastków rzeczywistych");    
    }

... aby wyliczyć np. deltę.

0
 dzialanie = b*b-4*a*c;  
  1. nazywaj zmienne tak, żeby po nazwie sugerowały od razu do czego ona jest np. delta= b*b-4*a*c;
 dzialanie = sqrt(dzialanie); 
  1. nie bój się deklarować nowych zmiennych double deltaPierw= = sqrt(delta)

  2. jak wklejasz kod to nie wklejaj kawałka kodu, bo nie widać gdzie zadeklarowałeś te zmienne. (a,b,c), albo przynajmniej całą klasę/metodę

  3. rozumiem że to twoje początki, ale polecam przeczytać jakąś książkę, albo przerobić sobie jakiś internetowy kurs

Przeczytaj o zasięgu widoczności zmiennych TUTAJ .

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