Zabezpieczenie przed liczbą ujemną

0

Witam,

Program generuje tablicę o rozmiarze a x b, gdzie a to wiersze, b to kolumny. Wartości te pobiera od użytkownika. Chciałbym dorobić mechanizm zabezpieczający przed wprowadzeniem liczby ujemnej. Zacząłem robić coś takiego:

public int getWiersze() {
        return wiersze;
    }

public int getKolumny() {
        return kolumny;
    }

public void setWiersze(int w) {
        if (w > 0) {
            wiersze = w;
        }
    }

public void setKolumny(int k) {
        if (k > 0) {
            kolumny = k;
        }
    }

Natomiast samo pobranie wygląda tak:

void GenerujTablica() {        
        System.out.println("Podaj ilość wierszy: ");
        wiersze = input.nextInt();        
        System.out.println("Podaj ilość kolumn: ");
        kolumny = input.nextInt();

        if (wiersze < 1 || kolumny < 1) {
            System.out.println("Wpisz wartości większe od zera!");
            GenerujTablica();
        }

        System.out.println("Tablica o rozmiarze " + getWiersze() + " x " + getKolumny());
}

Teraz pytanie: czy jest sens przerabiania kodu tak, aby warunek sprawdzania zamieszczać w metodach setWiersze i setKolumny? Czy może dać sobie spokój z tymi metodami set-get i zostawić to tak jak jest? Ewentualnie jak dodatkowo dopuścić użycie tylko i wyłącznie cyfr?

0
Lucas83 napisał(a):
  if (wiersze < 0 && kolumny < 0) {

tutaj raczej

if(wiersze<1 || kolumny<1)

wiersze bez kolumn i kolumny bez wierszy są chyba niepożądanym stanem ;)

0

Na pewno nie możesz zostawić tego w obecnej postaci. Jeżeli jakaś metoda zwraca void, to albo musi zachowywać się zawsze tak samo, albo dla nieprawidłowych sytuacji wyrzucić wyjątek. Obecnie jeżeli ustawisz liczbę ujemną lub nieujemną, to wprawdzie stan obiektu będzie spójny, ale użytkownik nie dowie się czy jego akcja miała jakikolwiek skutek.

Pomyśl nad tym co chcesz zrobić w całości. Jeżeli ten obiekt ma posiadać w sobie jeszcze tablicę dwuwymiarową z zawartością lub jakiś odpowiednik, to jako użytkownik oczekuję że poprzez zrobienie setWiersze, nie zmieni się tylko sztuczna ilość wierszy, ale faktycznie przechowywana. W tym wypadku najprostszym rozwiązaniem będzie stworzenie obiektu tablicy o stałym rozmiarze WxK, czyli bez metod setWiersze i setKolumny, a początkowe wartości podawać w konstruktorze. Wtedy albo podane wartości są prawidłowe i obiekt jest tworzony, albo nie i rzucany jest wyjątek. Jeżeli natomiast chciałbyś zmienić rozmiar istniejącej tablicy, to tworzysz nową na podstawie istniejącej. Pozwoli Ci to też na zaimplementowanie różnych strategii postępowania z danymi które mogą być utracone po takiej operacji.

0

@Lucas83: dyskusję prowadź w postach, nie w komentarzach.

0

Pomysł takiej organizacji wprowadzania danych:

void GenerujTablica() {        
        ... 
        if (coś_poszło_źle) {
            System.out.println("Wpisz wartości większe od zera!");
            GenerujTablica();
        }
}

woła o pomstę do nieba.
Powinieneś sprawdzać kilka rzeczy:

  • czy użytkownik wpisał liczby (typu int),
  • czy wiersze i kolumny nie są zbyt małe - to próbujesz robić,
  • czy wiersze i kolumny nie są zbyt duże - spróbuj utworzyć tablicę int[Integer.MAX_VALUE][Integer.MAX_VALUE]

Metody getWiersze i getKolumny są niepotrzebne. Jeżeli tab jest dwuwymiarową tablicą, to liczba wierszy = tab.length, a liczba kolumn = tab[0].length.

0

OK, skoro moja metoda kontroli poprawności wprowadzania danych jest nieprawidłowa, to jak należy poprawnie ją zrealizować? Jakim mechanizmem? Gdzie te warunki powinny być sprawdzane?

0

Warunki poprawności można sprawdzać po wprowadzaniu każdej liczby przez użytkownika, żeby od razu miał informację, że wprowadził złą liczbę. Chyba nikt nie lubi wprowadzać wszystkich danych od początku, gdy np błąd dotyczył tylko jednej wprowadzonej danej. :)

0

Zgadzam się, czyli w tym przypadku mechanizm powinien być zdublowany? Pierwsze sprawdzenie po wpisaniu wierszy, drugie zaraz po kolumnach? Pierwsze co mi do głowy przyszło, to właśnie instrukcja warunkowa IF, dlatego z niej skorzystałem i nawet działa :)

0

Błędem jest potencjalnie nieskończona rekurencja

void GenerujTablica(){
   ...
   GenerujTablica();
   ...
}
0

Zgadza się, kilka razy doprowadziłem do tego, że program zapętlił się w tym momencie :) Człowiek jest nowicjuszem i uczy się na błędach :)

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