Zadania rekrutacyjne

Zadania rekrutacyjne
AW
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
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".
Kopiuj
 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.
Kopiuj
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 ?

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
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? :)
UR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 360
1

Za samo nazewnictwo zmiennych lokalnych byś dostał odrzut.

CS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 296
1

ad.1

Kopiuj
  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:

Kopiuj
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ć:

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

albo bardziej poprawnie:

Kopiuj
 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.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
1

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

Kopiuj
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");
}
KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
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:

Kopiuj
    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

BraVolt
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 2918
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.

Kopiuj
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;
Kopiuj

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.