Poprawna Liczba Naturalna - interpretacja

0

Mam taki kod, pisałem go parę razy samemu, czytałem dokumentację i również posiłkowałem się stackiem oraz dokumentacją...

import java.util.Scanner;
	public class PoprawnaLiczbaNaturalna {
		public static void main(String[] args) {
			char znak;
			Scanner sc = new Scanner(System.in);
			

				System.out.print("liczba naturalna: ");
				String liczba = sc.nextLine();
				
				boolean liczbaOK = true;
				
				for (int i=0; i<liczba.length(); i++) {
					znak = liczba.charAt(i);

					if (!Character.isDigit(znak))
						liczbaOK = false;
					}
				
				if (liczbaOK) {
					System.out.printf("ciąg \'%s\' jest liczbą",liczba);
} 
				else {

						System.out.printf("ciąg \'%s\' nie jest liczbą",liczba);
				
				}
}
}

Rozumiem po kolei składnię, aczkolwiek mam problem z...

  1. Dlaczego
boolean liczbaOK = true;

jest zadeklarowane przed całą pętlą i od razu jest przypisana wartość "true", aniżeli przed pętlą samo

boolean liczbaOK;

a dopiero potem w pętli deklaracja w if'ach (false, true)

  1. W tej składni mam rozumieć, że działa to na zasadzie, że najpierw wyświetlana jest wartość true, a potem false i zawsze tak jest, tak jeżeli chodzi o boolean?
if (liczbaOK) {
					System.out.printf("ciąg \'%s\' jest liczbą",liczba);
} 
				else {

						System.out.printf("ciąg \'%s\' nie jest liczbą",liczba);
				
				}
7
  1. Jest przed pętlą, to założenie że na początku masz wartość ok, a dopiero gdy trafisz na wartość która nie jest liczbą, ustawiasz zmienną na false. Gdybyś zrobił tak:
for (int i=0; i<liczba.length(); i++) {
          znak = liczba.charAt(i);
           if (!Character.isDigit(znak))
                 liczbaOK = false;
           } else {
                 liczbaOk = true;
           }
} 

to zrobiłbyś źle, gdyż wtedy mógłbyś mieć jakiś znak nie liczbę, ale ostatni znak byłby liczbą i nadpisałbyś liczbaOK = false wartością true.
2. Tak, jeśli spełniony jest warunek, a spełnienie warunku w tym przypadku oznacza że liczbaOk jest true.

3

Twój kod jest bardzo niewydajny. Jeśli badany String ma postać 23m86797..., to już po odczytaniu trzeciego znaku (litera m) wiadomo, że to nie jest liczba i dalsze sprawdzanie jest zbędne. W tym programie String jest wpisywany przez użytkownika, można założyć, że nie będzie on długi. A gdybyś sprawdzał czy wszystkie znaki z pewnego ogromnego pliku są cyframi?
Lepszy jest taki kod:

                    if (!Character.isDigit(znak))
                        liczbaOK = false;
                        break;
                    }
1

Przepisałem kod @szarotka i dopisałem jeden wiersz. Kod @szarotka był błędny (brakowało nawiasu klamrowego), a ja go też nie dopisałem.

                    if (!Character.isDigit(znak)){
                        liczbaOK = false;
                        break;
                    }

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