Zadania rekrutacyjne

1
  1. Napisz program, który wypisuje liczby od 1 do 100. Ale dla wielokrotności trójki wyświetl "Fizz" zamiast
    liczby oraz dla wielokrotności piątki wyświetl "Buzz". Dla liczb będących wielokrotnościami trójki oraz
    piątki wyświetl "FizzBuzz".
 public void multiple() {
        for (int i = 1; i <= 100; i++) {
            if (i % 3 == 0) {
                System.out.println("Fizz");
                if (i % 5 == 0) {
                    System.out.println("FizzBuzz");
                }
            } else if (i % 5 == 0) {
                System.out.println("Buzz");
            } else {
                System.out.println(i);
            }
        }
    }

w odpowiedzi dostałem : "nadmiarowe modulo"

Co zrobiłem nie tak ?

  1. Napisz funkcję sprawdzającą poprawność daty w latach 2001-2099 (daty spoza tego okresu uznaj za
    niepoprawne).
    Wejście – trzy parametry liczbowe (dzień, miesiąc, rok).
    Wyjście – parametr logiczny (true – data poprawna, false – data niepoprawna) .
    Proszę zaimplementować własny algorytm kontroli – nie wolno korzystać z gotowych rozwiązań, np.
    LocalDate, Calendar, itp.
public class CorrectDate {

    public boolean correctDate() {
        Scanner in = new Scanner(System.in);
        System.out.println("Dzień:");
        int day = in.nextInt();
        System.out.println("Miesiąc:");
        int month = in.nextInt();
        System.out.println("Rok:");
        int year = in.nextInt();

        boolean clearDate = false;
        if (year >= 2001 && year <= 2099) {
            switch (month) {
                case 1, 3, 5, 7, 8, 10, 12: {
                    if (day <= 31 && day > 0) {
                        clearDate = true;
                        break;
                    }
                }
                case 2: {
                    boolean february = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);

                    if (day <= 28 && day > 0 && !february) {
                        clearDate = true;
                        break;
                    }
                    if (day <= 29 && day > 0 && february) {
                        clearDate = true;
                        break;
                    }
                    break;
                }
                case 4, 6, 9, 11: {
                    if (day <= 30 && day > 0) {
                        clearDate = true;
                        break;
                    }
                }
                default: {
                    clearDate = false;
                }
            }
        }
        System.out.println(clearDate);
        return clearDate;
    }
}

W odpowiedzi dostałem: "parametry przyjmowane niezgodnie z treścią zadania. Kod proceduralny"

Jak powinienem rozwiązać inaczej te zadania ?

2

Na stażystę rozumiem te zadania? :)

  1. Przeanalizuj, co wypiszesz dla liczby 15. Dopisałeś w ogóle jakieś testy?
  2. Proceduralnie, to znaczy w szczególności nieobiektowo. Powinieneś oddzielić kod zajmujący się parsowaniem parametrów z konsoli od logiki byznesowej - potencjalnie chciałbym użyć Twojego algorytmu w jakimś restowym endpoincie. Mogłeś pochwalić się np. znajomością wzorca value object i strategii. Na marginesie - co to jest clearDate? Chyba correctDate? :)
1

Za samo nazewnictwo zmiennych lokalnych byś dostał odrzut.

1

ad.1

  public void multiple() {
        for (int i = 1; i <= 100; i++) {
            System.out.print(i +" ");
            if (i % 3 == 0) {
                System.out.print("Fizz ");
            }
            if (i % 5 == 0) {
                System.out.print("Buzz");
            }
            System.out.println();
        }
    }

powyższa wersja nie spełnia warunków prawdziwego FizzBuzz, u Ciebie w opisie są sprzeczne warunki: wypisuje liczby od 1 do 100, a potem zamiast liczby ..., więc ta poniżej jest prawilna:

static public void multiple() {
        for (int i = 1; i <= 100; i++) {
            String result="";
            if (i % 3 == 0) {
                result += "Fizz";
            }
            if (i % 5 == 0) {
                result +="Buzz";
            }
            System.out.println(result.isEmpty()?i:result);
        }
    }

ad.2

Napisz funkcję sprawdzającą poprawność daty w latach 2001-2099 (daty spoza tego okresu uznaj za
niepoprawne).
Wejście – trzy parametry liczbowe (dzień, miesiąc, rok).
Wyjście – parametr logiczny (true – data poprawna, false – data niepoprawna) .
Proszę zaimplementować własny algorytm kontroli – nie wolno korzystać z gotowych rozwiązań, np.
LocalDate, Calendar, itp.

czyli sygnatura metody powinna być:

 public boolean correctDate(int day, int month, int day);

albo bardziej poprawnie:

 public boolean isCorrectDate(int day, int month, int day);

Sprawdzaj najpierw czy parametry są niepoprawne, czy rok i miesiąc mieści się w granicach i jeśli nie to wychodź z metody zwracając wartość. Stablicuj wartości dni dla kolejnych miesięcy uwzględniając przestępny rok, unikniesz zbędnego switch-a i kod będzie 2-3 razy krótszy.

1

Co do FizzBuzz to pierwszy link w google dla fizzbuzz java zwraca coś takiego https://stormit.pl/fizzbuzz/. Podoba mi się wersja

for (int i = 1; i <= 100; i++) {
    System.out.println(i % 15 != 0 ? i % 5 != 0 ? i % 3 != 0 ? String.valueOf(i) : "Fizz" : "Buzz" : "FizzBuzz");
}
1
Charles_Ray napisał(a):
  1. Proceduralnie, to znaczy w szczególności nieobiektowo. Powinieneś oddzielić kod zajmujący się parsowaniem parametrów z konsoli od logiki byznesowej - potencjalnie chciałbym użyć Twojego algorytmu w jakimś restowym endpoincie. Mogłeś pochwalić się np. znajomością wzorca value object i strategii. Na marginesie - co to jest clearDate? Chyba correctDate? :)

Niektórzy przez proceduralny rozumieją ukierunkowany na wykonywanie efektów. Jego odwrotnością jest funkcyjny czyli ukierunkowany na wyliczanie wartości.

@awium jest prosta instrukcja. Napisz funkcję. Są określone parametry wejściowe i rezultat zwracany. A u Ciebie tego nie ma. Powinno być coś w rodzaju:

    public boolean isCorrectDate(int year, int month, int day) {
        boolean clearDate = false;
        if (year >= 2001 && year <= 2099) {
            switch (month) {
                case 1, 3, 5, 7, 8, 10, 12: {
                    if (day <= 31 && day > 0) {
                        clearDate = true;
                        break;
                    }
                }
                case 2: {
                    boolean february = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);

                    if (day <= 28 && day > 0 && !february) {
                        clearDate = true;
                        break;
                    }
                    if (day <= 29 && day > 0 && february) {
                        clearDate = true;
                        break;
                    }
                    break;
                }
                case 4, 6, 9, 11: {
                    if (day <= 30 && day > 0) {
                        clearDate = true;
                        break;
                    }
                }
                default: {
                    clearDate = false;
                }
            }
        }
        return clearDate;
    }

Sprawdzać czy to poprawne, ani minimalizować ilości breaków mi się nie chce

0
awium napisał(a):

Co zrobiłem nie tak ?
< Napisz funkcję sprawdzającą poprawność daty w latach 2001-2099 (daty spoza tego okresu uznaj za
niepoprawne).
Wejście – trzy parametry liczbowe (dzień, miesiąc, rok).
Wyjście – parametr logiczny (true – data poprawna, false – data niepoprawna) .
Proszę zaimplementować własny algorytm kontroli – nie wolno korzystać z gotowych rozwiązań, np.
LocalDate, Calendar, itp.

public class CorrectDate {

    public boolean correctDate() {
        Scanner in = new Scanner(System.in);
        System.out.println("Dzień:");
        int day = in.nextInt();
        System.out.println("Miesiąc:");
        int month = in.nextInt();
        System.out.println("Rok:");
        int year = in.nextInt();

                    break;

Break, bo miały być parametry funkcji, sayHello("Hela")
OP dał Scanner.nextInt() dla wczytywania z konsoli

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