Problem początkującego z zadaniem

Problem początkującego z zadaniem
EK
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 godziny
  • 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:2 dni
  • Postów:616
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:8 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 2 godziny
  • 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 2 godziny
  • 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 2 godziny
  • 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 2 godziny
  • 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 2 godziny
  • 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:ponad 5 lat
  • Ostatnio:5 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:prawie 5 lat
  • Ostatnio:około 7 godzin
  • Postów:558
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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)