Problem początkującego z zadaniem

Problem początkującego z zadaniem
EK
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 5 godzin
  • Postów:12
0

Cześć

Mam zadanie, które sprawia mi duże problemy. Spróbuje opisać z czym się zmagam, uczę się dopiero jezyka javy, więc prosiłbym o wskazówki.i wyrozumiałość
Stwórzyłem klasy:

  • zwierze, która ma imię, wiek i może dać głos
  • pies, która ma rasę i daje głos.
  • lis, która ma kolor i daje głos
  • kot, która ma umaszczenie i daje głos

Mam kilka probłemów:

  1. Jak znaleŹć zwierze które jest najstarsze??
  2. Mam kłopot z tym, że nie wiem jak sobie poradzić by zabiezpieczyć klasę zwierzę aby nie dało sie stworzyć zwierzęcia z wiekiem ujemnym, a jeśli jest wiek ujemny to niech rzuci wyjatkiem InvalidAnimalAgeException, przeprowadzić tutaj symulacje z trycatch i pokazać przechwycenie wyjatku i jego obsluge.
  3. Rasy psa powinny byc typem wyliczeniowym, dostepne sa rasy Psa: Jork, Jamnik, Wilk.

Póki co stworzyłem wymienione klasy czyli zwierze, pies, lis, kot i klasę Main, a dalej utknąłem. Proszę o wskazówki bardziej doświadczonych Kolegów.

Kopiuj
   public class Zwierze {



    private String imie;
    private int wiek;

    public Zwierze(String imie, int wiek) {
        this.imie = imie;
        this.wiek = wiek;
    }

    public String getImie() {
        return imie;
    }

    public void setImie(String imie) {
        this.imie = imie;
    }

    public int getWiek() {
        return wiek;
    }

    public void setWiek(int wiek) {
        this.wiek = wiek;
    }

    public void dajGlos(){
            System.out.println("Daj głos");

        }

    @Override
    public String toString() {
        return "Zwierze{" +
                "imie='" + imie + '\'' +
                ", wiek=" + wiek +
                '}';
    }
}

Kopiuj

public class Kot extends Zwierze{



    private String umaszczenie;

    public Kot(String imie, int wiek) {
        super(imie, wiek);
    }


    public void dajGlos() {
        super.dajGlos();
        System.out.println("miau miau");
    }

    @Override
    public String toString() {
        return super.toString()+ ", umaszczenie=" + umaszczenie;
    }

Kopiuj


public class Pies extends Zwierze{



    private String rasa;

    public Pies(String imie, int wiek) {
        super(imie, wiek);
    }

    public void dajGlos() {
        super.dajGlos();
        System.out.println("hau hau");
    }

    @Override
    public String toString() {
        return super.toString()+ ", rasa=" + rasa;
    }
}

Kopiuj

public class Lis extends Zwierze{



    private String kolor;

    public Lis(String imie, int wiek) {
        super(imie, wiek);
    }


    public void dajGlos() {
        super.dajGlos();
        System.out.println("lititititit");
    }

    @Override
    public String toString() {
        return super.toString()+ ", kolor=" + kolor;
    }
}
RequiredNickname
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 3 godziny
  • Postów:620
1

Chyba faktycznie kolos ale na uczelni :)

Ad.1) Stwórz listę (albo inną kolekcję np. zbiór) sparametryzowaną typem Twojej klasy bazowej, przeiteruj po niej to znajdziesz najmniejszą wartość (możesz też użyć strumieni).
Ad.2) Możesz to zrobić po prostu w konstruktorze.
Ad.3) Ma być enum a w klasie Pies rasę zadeklarowałeś jako String. Czemu? Stwórz enuma i typ pola ustaw jako ten typ wyliczeniowy zamiast stringa.

EP
  • Rejestracja:około 5 lat
  • Ostatnio:9 miesięcy
  • Postów:89
1

Jak znaleŹć zwierze które jest najstarsze??

Prawdopodobnie chodzi tutaj o stworzenie kilku obiektów, zapisanie ich np. w tablicy a następnie np. pętlą for sprawdzenie których z nich ma najwiekszy wiek (getWiek())
Miałeś takie rzeczy? (obiekt, tablica, pętla)

edytowany 1x, ostatnio: Ephyron
EK
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 5 godzin
  • Postów:12
0

@RequiredNickname: ad3. stworzyłem nową klasę enum, która nazywa się RasyPsa i tam podałęm kilka ras. Dodałęm też prywatnego stringa o nazwie skrót.
Jeśli dobrze rozumiem to ma teraz w klasie Pies dodać enum RasyPsa??

EK
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 5 godzin
  • Postów:12
0

`Tak teraz wygląda klasa Pies i enum Rasy Psa

``

public class Pies extends Zwierze{

private RasyPsa rasyPsa;

public Pies(String imie, int wiek, RasyPsa rasyPsa) {
    super(imie, wiek);
    this.rasyPsa = rasyPsa;
}

public Pies(String imie, int wiek) {
    super(imie, wiek);
}

public void dajGlos() {
    super.dajGlos();
    System.out.println("hau hau");
}

@Override
public String toString() {
    return super.toString()+ ", rasyPsa=" + rasyPsa;
}






public enum RasyPsa {

SAMOYED("Samo"),
JORK("Jork"),
JAMNIK("Jam"),
WILK("W"),


private String skrót;

RasyPsa(String skrót) { this.skrót = skrót; }

public String getSkrót() {return skrót;}

```
edytowany 1x, ostatnio: ElKolos99
ZN
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 2 lata
  • Postów:49
1

Dobrze ci idzie, możesz teraz usunąć ten konstruktor aby nie móc stworzyć psa który nie ma rasy

Kopiuj
public Pies(String imie, int wiek) {
    super(imie, wiek);
}

powinieneś teraz dodać do konstruktora sprawdzenie podanego wieku Zwierzaka i rzucenie wyjątku

EK
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 5 godzin
  • Postów:12
0

w klasie Main dodałęm zwierzaki ale właśnie jak znaleźć najstarsze zwierzę i zabiezpieczyć klasę Zwierzę??

Kopiuj

     public static void main(String[] args) {



        Lis lis = new Lis("lis", 4);
        Kaczka kaczka = new Kaczka("kaczka", 3);
        Kot kot = new Kot("kot", 9);
        Pies pies = new Pies("pies", 33);


        Zwierze[] zwierzes = new Zwierze[4];
        zwierzes[0] = lis;
        zwierzes[1] = kaczka;
        zwierzes[2] = kot;
        zwierzes[3] = pies;
        for (Zwierze v : zwierzes) {
            v.dajGlos();
edytowany 2x, ostatnio: ElKolos99
PA
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:288
1

Najwyższy wiek to tylko przypisujesz pierwszy wiek z listy do jakiejś zmiennej i w pętli sprawdzasz czy wiek jest wyższy od tego który jest w tej zmiennej

Kopiuj
Zwierze[] zwierzes = new Zwierze[4];
zwierzes[0] = lis;
zwierzes[1] = kaczka;
zwierzes[2] = kot;
zwierzes[3] = pies;

int highestAge = zwierzes[0].wiek;

foreach (Zwierze v : zwierzes) {
    v.dajGlos();
    if (v.wiek > highestAge)
    {
        highestAge = v.wiek;
    }
}
edytowany 9x, ostatnio: pavarotti
EK
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 5 godzin
  • Postów:12
0

dzięki @pavarotti poradziłem sobie z tym późną nocą. Dodałem tez metodę toString do każdej klasy, która wypisuje wszystkie parametry danego zwierzaka, ładniejsze dla oka:).

Nie potrafię rozgryźć zagadnienia z zabezpieczeniem klasy zwierze aby nie dało się stworzyć zwierzęcia z ujemnym wiekiem. A dalej pokazać symulację trycatch i przechwycenie wyjatku i jakas jego obsluge.

Panowie macie jakieś wskazówki? Jak wyglądałby taki kod??

PA
PA
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:288
0

Albo deklarujesz typ zmiennej uint i wtedy z automatu nie może mieć ujemnych - dobra wyczytałem że w Javie nie ma unsigned intów.
W takim razie sprawdzasz ifem czy nie jest ujemna:

Kopiuj
if (age >=0)
{
    //do something
}

Albo robisz pętlę która się wykona dopiero jeśli liczba będzie >= 0:

Kopiuj
do
{
    int age = int.Parse(Console.ReadLine());
} while (age >= 0);

Możesz napisać metodę:

Kopiuj
public bool IsPosivite(int number)
    => number >= 0;

i gdzieś to potem sprawdzać.
A no i ja w C# Ci daje rozwiązanie, Ty musisz to napisać tak jak Ci pasuje.

edytowany 9x, ostatnio: pavarotti
EK
dzięki ok, nie miałem jeszcze okazji programować w C#, ale spróbuje to przełożyć na Jave.
PA
Praktycznie wszystko to samo
EK
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 5 godzin
  • Postów:12
0

Panowie ktoś mógłby spojrzeć na ten kod i wskazać gdzie jest błąd?? Chodzi o to by wskazać najstarsze zwierze.
Kompletnie pogubiłem się w temacie wyjątków w tym zadaniu, pomimo pomocy @pavarotti nic mi nie wychodzi.
Jak ogarnąć ten temat??

Kopiuj
        Lis lis = new Lis("lis", 4, "Czarny");
        Kaczka kaczka = new Kaczka("kaczka", 3, 33);
        Kot kot = new Kot("kot", 9, "Ciemne");
        Pies pies = new Pies("pies", 33,RasyPsa.JAMNIK);


      

      Zwierze[] zwierzes = new Zwierze[4];
        zwierzes[0] = lis;
        zwierzes[1] = kaczka;
        zwierzes[2] = kot;
        zwierzes[3] = pies;

        int najstarszeZwierze = zwierzes[0].getWiek();


        for (Zwierze v : zwierzes) {
            v.dajGlos();
            if (v.getWiek() > najstarszeZwierze) {
                najstarszeZwierze = v.getWiek();
            }

        }
edytowany 1x, ostatnio: ElKolos99
PA
A jaki masz błąd?
EK
w konsoli brak informacji odnośnie najstarszego zwierza
PA
No bo musisz to sobie wypisać
EK
Edytowałem kod, w jaki sposób to wypisać??
PA
Skoro nie wiesz jak masz wypisać to co wg polecenia trzeba zrobić?
UN
  • Rejestracja:prawie 6 lat
  • Ostatnio:6 miesięcy
  • Postów:36
1

@ElKolos99: W momencie kiedy znajdujesz wiek najstarszego zwierzęcia to musisz je także przechować, aby móc później wypisać:

Kopiuj
int najstarszeZwierze = zwierzes[0].getWiek();
Zwierze najstarszeZwierzeObiekt = zwierzes[0];
        for (Zwierze v : zwierzes) {
            v.dajGlos();
            if (v.getWiek() > najstarszeZwierze) {
                najstarszeZwierze = v.getWiek();
                najstarszeZwierzeObiekt = v;
            }
        }
//Twoim najstaszym zwierzęciem jest teraz najstarszeZwierzeObiekt 
//w wieku najstarszeZwierze (popracuj na nazwami zmiennych oraz spróbuj to wypisać korzystając z funkcji System.out.println(...))
//aby znalezc imie zwierzęcia prawdopodobnie musisz skorzystać z funkcji zwracającej imie, getImie() (analogicznie jak dla getWiek()) 
edytowany 3x, ostatnio: Undersent
EK
dzięki, porównam to z moim kodem
Korges
  • Rejestracja:około 5 lat
  • Ostatnio:około 12 godzin
  • Postów:568
1
Kopiuj
public interface GiveAVoice {
    void giveAVoice();
}
Kopiuj
public abstract class Animal implements GiveAVoice {
    private final String name;
    private final Integer age;

    public Animal(final String name, final Integer age) {
        validateAnimalAge(age);
        this.name = name;
        this.age = age;
    }

    private void validateAnimalAge(final int age) {
        if (age < 0) {
            throw new InvalidAnimalAgeException();
        }
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}

Kopiuj
public class Cat extends Animal {
    private final Umaszczenie umaszczenie;

    public Cat(final String name, final Integer age, final Umaszczenie umaszczenie) {
        super(name, age);
        this.umaszczenie = umaszczenie;
    }

    @Override
    public void giveAVoice() {
        System.out.println("Meow");
    }

    public Umaszczenie getUmaszczenie() {
        return umaszczenie;
    }
}

Kopiuj
public class Dog extends Animal {
    private final Breed breed;

    public Dog(final String name, final Integer age, final Breed breed) {
        super(name, age);
        this.breed = breed;
    }

    @Override
    public void giveAVoice() {
        System.out.println("Bark Bark!");
    }
}

Kopiuj
public class Fox extends Animal {
    private final Color color;

    public Fox(final String name, final Integer age, final Color color) {
        super(name, age);
        this.color = color;
    }

    @Override
    public void giveAVoice() {
        System.out.println("What does the fox say?");
    }

    public Color getColor() {
        return color;
    }
}

Kopiuj
public static void main(String[] args) {
        Dog dog = new Dog("Burek", 1, Breed.MONGREL);
        Fox fox = new Fox("Lisek Chytrusek", 2, Color.GINGER);
        Cat cat = new Cat("Filemon", 3, Umaszczenie.W_KROPKI);

        List<Animal> animalList = List.of(dog, fox, cat);
        Animal staryDziad = animalList.stream()
                .max(Comparator.comparing(Animal::getAge))
                .orElseThrow(NoSuchElementException::new);

        System.out.printf("Stary dziad to %s i ma %d lat", staryDziad.getName(), staryDziad.getAge());
    }
EK
Dzięki za kod, spróbuję go porównać z moim. Ale mam tutaj problem z kompilacją.
Korges
Java 11. Zrób sobie enumy i InvalidAnimalAgeException

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.