Zadanie testowe Java

0

Witam wszystkich
Mam problem z zadaniem i niemały ból głowy.
Zadanie brzmi:
zapytaj uzytkownika o numer pesel, nastepnie dokonaj walidacji nr pesel.
To moje pierwsze zadanie gdzie nie mam podanych przykładowych klas i czym się kierować w rozwiązaniu tego zadania.
Jeśli dobrze kombinuję to mam stworzyć klasę użytkownik z polami imię ,nazwisko, numerem pesel, dalej muszę go zapytać czyli stowrzyć metodę?
Prosiłbym o nakierowanie mnie jak to ogarnąć, z góry dzięki

1

Masz napisać aplikację która w terminalu poprosi Cię o wpisanie numeru pesel, potem ten pesel wykorzystasz jako argument napisanej przez siebie metody która zwaliduje czy jest poprawny (poszukaj w internecie jakie warunki musi spełniać pesel) i zwróci wynik true lub false, finalnie wynik walidacji powinieneś wyświetlić użytkownikowi.

Podsumowując wystarczy Ci metoda main + prywatna funkcja walidująca pesel. Żadnych klas "użytkownik" nie tworzysz bo użytkownikiem jesteś Ty (osoba uruchamiająca aplikację i wpisująca numer pesel na klawiaturze).

https://javastart.pl/baza-wiedzy/java-podstawy-jezyka/podstawowe-wejscie-wyjscie

0

@RequiredNickname: dzięki za objaśnienie.
Ma to być aplikacja która w terminalu popros o wpisanie numeru pesel czyli przyda się tutaj klasa scanner??

3
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        String pesel = scanner.nextLine();

        if (pesel.length() == 11) {
            System.out.println("Pesel poprawny");
        } else {
            System.out.println("Pesel niepoprawny");
        }


    }
}

0

Stworzyłem taki o to kod

``
public class Pesel {

    private static PeselValidator PeselVal;

    public static void main(String[] args) {
        String PESEL;


        System.out.println("Podaj numer PESEL");
        PESEL = Console.readString("?");
        PeselVal = new PeselValidator(PESEL);

        if (PeselVal.isValid()) {
            System.out.println("Numer PESEL jest prawid³owy");
            System.out.println("Rok urodzenia: " + PeselVal.getBirthYear());
            System.out.println("Miesiąc urodzenia: " + PeselVal.getBirthMonth());
            System.out.println("Dzien urodzenia: " + PeselVal.getBirthDay());
            System.out.println("Płeć: " + PeselVal.getSex());
        }
        else {
            System.out.println("Numer PESEL jest nieprawidłowy");
        }
    }
}
0

Ten Validator, który robi więcej niż walidację ... trochę overkil

Dobra nazwa klasy merytorycznie wiodącej klasy to właśnie Pesel, z metodą np bool isValid() albo static boll isValid(string)
Ty nazwę trochę marnujesz na main() 'a

Z zadania nie wynika, że to ma być maksymalnie obiektowa choinka klas. MZ wystarczy jedna a niezła

0

czyli trochę przekombinowałem całe te zadanie?
jedna klasa z metodami tak czyli jak by wg finalny kod ??

0

Zapoznaj się z konwencjami nazewnictwa różnych elementów w kodzie (np. camelCase itp). PeselVal to niepoprawna nazwa.
Nie przedstawiłeś kodu klasy PeselValidator.
Po co tworzysz obiekt typu PeselValidator i przekazujesz mu pesel w konstruktorze? A co gdyby ktoś inny chciał zwalidować inny pesel? Ma tworzyć obiekt per pesel?
Trzeba było napisać po prostu prywatną(poczytaj o enkapsulacji) funkcję pod funkcją main.

Tworzysz obiekt typu PeselValidator, podajesz w konstruktorze numer pesel i na podstawie walidacji ustawiasz pole isValid. Bez sensu ;)

0

Tak wygląda klasa peselValidator, poprawię nazewnictwo. Ogólnie to działa ale można to zrobić inaczej i chciałbym pójść w tym kierunku by to usprawnić

public class peselValidator {


    private byte PESEL[] = new byte[11];
    private boolean valid = false;

    public peselValidator(String PESELNumber) {
        if (PESELNumber.length() != 11){
            valid = false;
        }
        else {
            for (int i = 0; i < 11; i++){
                PESEL[i] = Byte.parseByte(PESELNumber.substring(i, i+1));
            }
            if (checkSum() && checkMonth() && checkDay()) {
                valid = true;
            }
            else {
                valid = false;
            }
        }
    }

    public boolean isValid() {
        return valid;
    }

    public int getBirthYear() {
        int year;
        int month;
        year = 10 * PESEL[0];
        year += PESEL[1];
        month = 10 * PESEL[2];
        month += PESEL[3];
        if (month > 80 && month < 93) {
            year += 1800;
        }
        else if (month > 0 && month < 13) {
            year += 1900;
        }
        else if (month > 20 && month < 33) {
            year += 2000;
        }
        else if (month > 40 && month < 53) {
            year += 2100;
        }
        else if (month > 60 && month < 73) {
            year += 2200;
        }
        return year;
    }

    public int getBirthMonth() {
        int month;
        month = 10 * PESEL[2];
        month += PESEL[3];
        if (month > 80 && month < 93) {
            month -= 80;
        }
        else if (month > 20 && month < 33) {
            month -= 20;
        }
        else if (month > 40 && month < 53) {
            month -= 40;
        }
        else if (month > 60 && month < 73) {
            month -= 60;
        }
        return month;
    }


    public int getBirthDay() {
        int day;
        day = 10 * PESEL[4];
        day += PESEL[5];
        return day;
    }

    public String getSex() {
        if (valid) {
            if (PESEL[9] % 2 == 1) {
                return "Mezczyzna";
            }
            else {
                return "Kobieta";
            }
        }
        else {
            return "---";
        }
    }

    private boolean checkSum() {
        int sum = 1 * PESEL[0] +
                3 * PESEL[1] +
                7 * PESEL[2] +
                9 * PESEL[3] +
                1 * PESEL[4] +
                3 * PESEL[5] +
                7 * PESEL[6] +
                9 * PESEL[7] +
                1 * PESEL[8] +
                3 * PESEL[9];
        sum %= 10;
        sum = 10 - sum;
        sum %= 10;

        if (sum == PESEL[10]) {
            return true;
        }
        else {
            return false;
        }
    }

    private boolean checkMonth() {
        int month = getBirthMonth();
        int day = getBirthDay();
        if (month > 0 && month < 13) {
            return true;
        }
        else {
            return false;
        }
    }

    private boolean checkDay() {
        int year = getBirthYear();
        int month = getBirthMonth();
        int day = getBirthDay();
        if ((day >0 && day < 32) &&
                (month == 1 || month == 3 || month == 5 ||
                        month == 7 || month == 8 || month == 10 ||
                        month == 12)) {
            return true;
        }
        else if ((day >0 && day < 31) &&
                (month == 4 || month == 6 || month == 9 ||
                        month == 11)) {
            return true;
        }
        else if ((day >0 && day < 30 && leapYear(year)) ||
                (day >0 && day < 29 && !leapYear(year))) {
            return true;
        }
        else {
            return false;
        }
    }

    private boolean leapYear(int year) {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            return true;
        else
            return false;
    }
}

0
  • sposób jego kreowania i rytm działania - pisał @RequiredNickname
  • i mnie rażą "formalności" tzn nazwy niezgodne z konwencją itd...
  • element pesela zdecydowanie jest char'em a nie byte'm. (nie martw się, nie wysadzisz w powietrze arytmetyki)
  • Metody bool isXxxxx

Mo i to za bogate jak na validator.

0

ok, to w takim razie jak poprawnie wg Was wyglądał by kod?? jeśli ten jest zły, mogę prosić o poprawny by porównać go sobie??

0

Tutaj raczej nie chodzi o to żebyś się popisywał obiektówką tylko o to czy umiesz zaimplementować algorytm.

Ogólna struktura klas powinna wyglądać jak najprościej, przykład:


import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
	static boolean isValidPesel(String pesel) {
		return isValidLength(pesel);
	}
	
	private static boolean isValidLength(String pesel) {
		return pesel != null && pesel.length() == 11;
	}
	
	public static void main (String[] args) throws java.lang.Exception
	{
		System.out.println("Podaj nr PESEL: ");
		Scanner scanner = new Scanner(System.in);
        String inputString = scanner.nextLine();
        if (isValidPesel(inputString)) {
        	System.out.println("Poprawny!");
        } else {
        	System.out.println("Niepoprawny!");
        }
	}
}

https://ideone.com/vAXdQ6

TODO: zaimplementować algorytm w isValidChecksum i wywołać w isValidPesel.

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