Java - Pętla while

0

Witam,

napisałem program do przećwiczenia pętli który ma sprawdzać walidacje danych.

Niestety program jest jakby w pętli nieskończonej a ja nie mam pomysłu dlaczego tak się dzieje. Mogę prosić o pomoc ?

Oto kod:

import java.util.Scanner;

public class Analysis {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        int passes = 0;
        int failures = 0;
        int studentCounter = 1;

        System.out.print("Wpisz wynik (1 = zdany, 2 = niezdany): ");
        int result = input.nextInt();

        while(studentCounter <= 10) {
            while(result != 1 || result != 2) {
                if (result == 1) {
                    passes = passes + 1;
                    studentCounter = studentCounter + 1;
                } else if (result == 2) {
                    failures = failures + 1;
                    studentCounter = studentCounter + 1;
                }
                System.out.print("Wpisz wynik (1 = zdany, 2 = niezdany): ");
                result = input.nextInt();
            }
            System.out.println(studentCounter);
        }
        System.out.printf("Zdało: %d. Nie zdało: %d.%n", passes, failures);
        if(passes >= 8) {
            System.out.println("Premia dla wykładowcy!");
        }
    }
}

0

Paragaf 44, jak żywy:) Żeby wykonać przebieg wewnętrznej pętli (gdzie możemy zinkrementować studentCounter) result nie może być 1 ani 2, a jeśli nie będzie, to nie zinkrementujemy studentCounter (studentCounter możemy zinkrementować tylko gdy result wynosi 1 lub 2). Czyli, jeśli jesteśmy zdrowi psychicznie, to nigdy nie wyjdziemy z zewnętrznej pętli:)

1

Masz błąd logiczny w warunku:

while(result != 1 || result != 2)

oznacza wykonuj jeśli: result != 1 lub result != 2, czyli mając podany jakikolwiek dowolny znak i tak wejdzie do while.

Powinieneś zmienić ten warunek na:

while(result == 1 || result == 2)

Aczkolwiek po poprawieniu tego błędu logicznego nadal będzie nieskończona pętla, bo mamy kolejny błąd logiczny

result = input.nextInt();

wewnątrz drugiego while, co spowoduje, że jak wpiszesz znak inny niż 1 lub 2, to nie wczyta ci kolejnego znaku tylko się zapętli.

Radzę nie robić while w while, tylko zostawić jedno while i trochę to przerobić :)

0

Z góry dziękuje za pomocne komentarze.
Jednak ciekawi mnie jedna rzecz ,że jak zrobię to w jednej pętli czyli :

while ((studentCounter <= 10)&&(result == 1 || result == 2))

to wszystko działa. A ja nwm dlaczego ? Według mnie te zapisy są równoważne. Chyba, że się mylę.

W 2 pętli while chodziło mi o to żeby w przypadku wpisania innej liczby niż 1 lub 2 ponownie prosiła o wpisanie wyniku.
To w takim wypadku ten warunek jest zły ?

0

Zamiast pętli wystarczy zwykłe else w warunku. W tym wypadku nawet to nie jest potrzebne bo przeniesienie komunikatu i wczytywania do pętli rozwiązuje problem.

import java.util.Scanner;
 
public class Analysis {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
 
        int passes = 0;
        int failures = 0;
        int studentCounter = 1;
 
        int result = 0;
 
        while(studentCounter <= 10) {
            System.out.print("Wpisz wynik (1 = zdany, 2 = niezdany): ");
            result = input.nextInt();
            if (result == 1) {
                passes = passes + 1;
                studentCounter = studentCounter + 1;
            } else if (result == 2) {
                failures = failures + 1;
                studentCounter = studentCounter + 1;
            }
            System.out.println(studentCounter);
        }
        System.out.printf("Zdało: %d. Nie zdało: %d.%n", passes, failures);
        if(passes >= 8) {
            System.out.println("Premia dla wykładowcy!");
        }
    }
}

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