Problem z pętlami, początkujący

0

Witam, niedawno zacząłem naukę programowania w języku java. Aktualnie napisałem prosty program kalkulator, natomiast nie do końca wygląda tak jak bym tego sobie życzył. Mianowicie chciałbym aby po wciśnięciu liczby 0 w każdym miejscu programu, program powracał do menu głównego i dalej pracował. Nie do końca wiem jak ten problem rozwiązać, dlatego muszę prosić kogoś o pomoc. Pozdrawiam
Kod:

import java.util.Scanner;
public class p11 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Jesteś w programie kalkulator.");
        System.out.print("1. + \n2. - \n3. * \n4. / \nPodaj wybór: ");
        //zmienne
        char wybór;
        wybór = scan.next().charAt(0);
        Double x;

        switch (wybór) {

            case '+': {
                System.out.println("Wciśnij 0 żeby przerwać program lub podaj liczbę: ");
                Double liczba = scan.nextDouble();
                if (!(liczba == 0)) {
                do {
                    System.out.println("Podaj liczbe: ");
                    x = scan.nextDouble();
                    liczba += x;
                    System.out.println("Wynik: " + liczba);
                } while (!(x == 0));
            } else System.out.println("Wcisnąłeś 0. Zakończyłem program.");
            }
            break;

            case '-': {
                System.out.println("Wciśnij 0 żeby przerwać program lub podaj liczbę: ");
                Double liczba = scan.nextDouble();
                if (!(liczba == 0)) {
                    do {
                        System.out.print("Podaj liczbe: ");
                        x = scan.nextDouble();
                        liczba -= x;
                        System.out.println("Wynik: " + liczba);
                    } while (!(x == 0));
                } else System.out.println("Wcisnąłeś 0. Zakończyłem program.");
            }
            break;
            case '*': {

                System.out.println("Wciśnij 0 żeby przerwać program lub podaj liczbę: ");
                Double liczba = scan.nextDouble();
                if (!(liczba == 0)) {
                    do {
                        System.out.print("Podaj liczbe: ");
                        x = scan.nextDouble();
                        liczba *= x;
                        System.out.println("Wynik: " + liczba);
                    } while (!(x == 0));
                } else System.out.println("Wcisnąłeś 0. Zakończyłem program.");
            }
            break;
            case '/':
                System.out.println("Wciśnij 0 żeby przerwać program lub podaj liczbę: ");
                Double liczba = scan.nextDouble();
                if (!(liczba == 0)) {
                do {
                    System.out.print("Podaj liczbe: ");
                    x = scan.nextDouble();
                    liczba /= x;
                    System.out.println("Wynik: " + liczba);
                } while (!(x == 0));
            } else System.out.println("Wcisnąłeś 0. Zakończyłem program.");
                break;
            default:
                System.out.println("Wcisnąłeś zły znak!");
            }

        }
    }
2

Tak jest bez sensu, bo nie Możesz używac zera, jako inputu; lepiej wszystko dać w pętli while i po wykonaniu każdego działania wracać na początek (wybór operatora, albo e, jako exit).

1

A więc mam pozbyć się switcha i zrobić wszystko w jednej pętli while?

1

Spróbuj jakoś tak:

import java.util.*;
class Main {

  public static void main(String[] args) {
    boolean test = false;
    Scanner scan = new Scanner(System.in);
        System.out.println("Jesteś w programie kalkulator.");
        while (true) {
        System.out.print("1. + \n2. - \n3. * \n4. / \nPodaj wybór(exit by wyjść): ");
        //zmienne
        String wybór;
        wybór = scan.nextLine() ;
        Double x;

        switch (wybór) {

            case "+": {
                System.out.println("Podaj pierwsza liczbę : ");
                Double liczba = scan.nextDouble();
                System.out.println("Podaj druga liczbe: ");
                x = scan.nextDouble();
                liczba += x;
                System.out.println("Wynik: " + liczba);
              } 

            break;

            case "-": {
                System.out.println("Podaj pierwsza liczbę : ");
                Double liczba = scan.nextDouble();
                System.out.println("Podaj druga liczbe: ");
                x = scan.nextDouble();
                liczba -= x;
                System.out.println("Wynik: " + liczba);
            }
            break;
            case "*": {
                System.out.println("Podaj pierwsza liczbę : ");
                Double liczba = scan.nextDouble();
                System.out.println("Podaj druga liczbe: ");
                x = scan.nextDouble();
                liczba *= x;
                System.out.println("Wynik: " + liczba); 
            }
            break;
            case "/":{
                System.out.println("Podaj pierwsza liczbę : ");
                Double liczba = scan.nextDouble();
                System.out.println("Podaj druga liczbe: ");
                x = scan.nextDouble();
                liczba /= x;
                System.out.println("Wynik: " + liczba);   
            }   
                break;
            case "exit" :{
              test = true;

            }
            break;
            default:
              System.out.println("Wcisnąłeś zły znak!");
            }
            if (test){
              System.out.println("Bye!");
               break;
            }
        }
  }   
}
1
mrx669 napisał(a):

A więc mam pozbyć się switcha i zrobić wszystko w jednej pętli while?

Sam napisałeś co chcesz osiągnąć. Teraz rozłóż to na kroki, np.:

1 poczekaj na tekst z klawiatury,

  1. sprawdź czy wpisany tekst to "rozkaz wyjścia z programu",
  2. jeśli tak, to wyjdź,
  3. jeśli nie, to uznaj wpisany tekst za działanie,
  4. oblicz działanie,
  5. wypisz wynik,
  6. wróć do punktu 1.
1

Dziękuje Wam za pomoc, spróbuję nad tym popracować.

0

polecam również spróbować reguły DRY - Dont Repeat Yourself, czyli spróbuj wyodrębnić kod, który jest powtarzany do osobnej metody. Biorąc pod uwagę to co napisał @lion137:

System.out.println("Podaj pierwsza liczbę : ");
Double liczba = scan.nextDouble();
System.out.println("Podaj druga liczbe: ");
x = scan.nextDouble();
liczba += x;
System.out.println("Wynik: " + liczba);

ten fragment można zapisać w innej metodzie.
Dalej można zrobić refactor i wydzielić switch-case do odrębnej metody i wtedy napiszesz kolejną metodę obsługującą te działania:

liczba += x;
liczba -= x;
liczba *= x;
liczba /= x;

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