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
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
@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??
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");
}
}
}
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");
}
}
}
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
czyli trochę przekombinowałem całe te zadanie?
jedna klasa z metodami tak czyli jak by wg finalny kod ??
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 ;)
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;
}
}
- 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.
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??
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!");
}
}
}
TODO: zaimplementować algorytm w isValidChecksum i wywołać w isValidPesel.