Switch i Case'y nie działają

0

Natrafiłem na takie zadanie:Napisz program, który odczytuje od użytkownika wartość z obojętnie jakiego zakresu. Jeśli liczba jest ujemna – liczy ją do zera (cyfrowo – niesłownie). Jeśli wynosi zero – program wyświetla tylko tą wartość. Jeśli powyżej zera – zlicza od tej liczby do zera. Co jest nie tak z moim kodem? Oczywiście zamiast odpowiedniej instrukcji w case'ach wpisałem tylko d lub dd, lub ddd, żeby wiedzieć czy dobrze zadziała, jednak tak nie jest. W pierwszym przypadku wyświetla d,dd,ddd, w drugim dd,ddd, w trzecim ddd.
Dopiero zaczynam się uczyć i wyczytałem, że Switch obsługuje tylko int do Javy6, więc chciałem ich użyć wykorzystując if.

int liczba;
        
        System.out.println("Podaj liczbę: ");
        Scanner skaner = new Scanner(System.in);
        liczba = skaner.nextInt();
        
        if(liczba>0){
            liczba=1;
        }
        else if(liczba==0){
            liczba=2;
        }
        else if(liczba<0){
            liczba=3;
        }
        
        switch(liczba){
            case 1:
                System.out.println("d");
            case 2:
                System.out.println("dd");
            case 3:
                System.out.println("ddd");
                break;
            default:
                System.out.println("Źle wybrałeś.");
        }
1

Brakuje ci break w każdym case. Inaczej case leci dalej po wszystkich przypadkach.

1

Tutaj masz identyczny przykład jak twój kod: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

W skrócie: kod w case wykonuje się aż do napotkania break. Dodaj break do każdego przypadku.

0

Ok. Dziękuję. Źle zrozumiałem breake'a. Myślałem, że jego użycie na samym końcu JUŻ załatwia wszystko. I tak zastanawia mnie jednak dlaczego wykonuje instrukcje ze wszystkich case'ów skoro... hmm może na przykładzie: podaję liczbę np. 21>0 => liczba=1, więc dlaczego wykonuje także case'y 2 i 3. Nie powinien wykonać tylko 1 skoro liczba = 1? Mogę prosić o jakieś wytłumaczenie?

1

Dzieje się tak, ponieważ tak jak powiedzieli Ci inni użytkownicy brakuje breaka. W przypadku gdy liczba wynosi 1 wchodzi od no case 1 i wykonuje kod. Następnie sprawdza czy jest break jeśli nie ma to wykonuje następny case jeśli jest to wychodzi z switcha. Prawidłowy kod został umieszczony poniżej.

        switch(liczba){
            case 1:
                System.out.println("d"); break;
            case 2:
                System.out.println("dd"); break;
            case 3:
                System.out.println("ddd"); break;
            default:
                System.out.println("Źle wybrałeś.");
        }
0

Jaki jest problem z tym forem? Nie miałem innego pomysłu, żeby "liczba" pozostała "liczbą ze Scannera", czy to przewinia?

public class pierwzecasy {
    public static void main(String []args){
        
        int liczba;
        int liczba1;
        
        System.out.println("Podaj liczbę: ");
        Scanner skaner = new Scanner(System.in);
        liczba = skaner.nextInt();
        
        if(liczba>0){
            liczba1=liczba;
            liczba=1;
        }
        else if(liczba==0){
            liczba=2;
        }
        else if(liczba<0){
            liczba=3;
        }
        
        System.out.println("Rezultat: ");
        
        switch(liczba){
            case 1:
                for(liczba1; liczba1>0; liczba1++){
                    System.out.println("c");
                }
                break;
            case 2:
                System.out.println("0");
                break;
            case 3:
                System.out.println("ddd");
                break;
            default:
                System.out.println("Źle wybrałeś.");
        }

Zrobiłem to z whilem. Ale czemu ten for nie działał?

int liczba;
        int liczba1 = 0;
        
        System.out.println("Podaj liczbę: ");
        Scanner skaner = new Scanner(System.in);
        liczba = skaner.nextInt();
        
        if(liczba>0){
            liczba1=liczba;
            liczba=1;
        }
        else if(liczba==0){
            liczba=2;
        }
        else if(liczba<0){
            liczba1=liczba;
            liczba=3;
        }
        
        System.out.println("Rezultat: ");
        
        switch(liczba){
            case 1:
                while(liczba1>0){
                    System.out.println(liczba1);
                    liczba1--;
                }
                break;
            case 2:
                System.out.println("0");
                break;
            case 3:
                while(liczba1<0){
                    System.out.println(liczba1);
                    liczba1++;
                }
                break;
            default:
                System.out.println("Źle wybrałeś.");
        }
1

Nie bardzo rozumiem. Zrobiłeś tam pętlę która się obróci miliardy razy bo skoro liczba == 1 i ją ZWIĘKSZASZ to przez długi czas będzie większa od zera...

1
for(liczba1; liczba1>0; liczba1++){
                    System.out.println("c");
                }

Powyższa pętla jest nieskończona ponieważ liczba1 jest większa od zera a Ty ją jeszcze zwiększasz. Pętla for, która ma taki sam zapis jak stworzona przez Ciebie pętla while, wygląda następująco:

for( ; liczba1>0; liczba1--){
                    System.out.println("c");
                }
0

Powinoo być liczba1-- w tym forze. Przykład: wybieram liczbę 25. for powinien zacząć odliczać do 0 moim zdaniem i wypisywać, a tego nie robi 'not a statement', myślałem, że to może dlatego, że liczba1 nie jest zainicjalizowana, ale to nie to. Rozumiemy się?

Ops, nie odświeżyłem. Oczywiście z liczba-- racja, niedopatrzenie, ale to i tak nie miało wpływu, gdyby program się odpalił, zauważyłbym to. Bardzo ciekawi mnie jak to jest możliwe for

( ; liczba1>0; liczba1--)

, dlaczego nie wpisałeś nic na początku? Chciałem zrobić właśnie coś takiego, ale nie wiedziałem za bardzo jak bez podawania liczba1. właśnie dlatego program się nie odpalał. Myślałem, że weźmie liczba1 z początku programu, gdzie u siebie (na forum wstawione jest bez tego) mam liczba1 = 0

1

Możesz w pierwszej sekcji nie mieć nic.

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