Osoba z najwyższym dochodem - program

Osoba z najwyższym dochodem - program
KA
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 lata
  • Postów:27
0

(początkujący) Siemka :) . Znajdź osobę z największym dochodem. Czyli konsola ma wypisac np: Najwyższy dochód: Kazimierz Stonoga 4500. Klasy obiekty tablice wszystko sam stworzyłem tylko zostało jeszcze znaleźć delikwenta co najwięcej zarabia.
Stworzyłem w klasie Student i Employee metodę o tej samej nazwie getIncome, ale różnych argumentach, czy można jej jakoś użyć do rozwiązania tego zadania ? Czy zrobić to jakoś inaczej ?

Kopiuj
public class Person {

    String name;
    String surname;
    long pesel;
    String city;

    public Person(String name, String surname, long pesel, String city) {
        this.name = name;
        this.surname = surname;
        this.pesel = pesel;
        this.city = city;
    }

    public String getName() {
        return name;
    }

    public String getSurname() {
        return surname;
    }

    public long getPesel() {
        return pesel;
    }

    public String getCity() {
        return city;
    }

    public String toString(){
        return name + " " + surname + ", PESEL: " + pesel + " city: " + city;
    }
}

public class Employee extends Person {

    String position;
    int salary;

    public Employee(String name, String surname, long pesel, String city, String position, int salary) {
        super(name, surname, pesel, city);
        this.position = position;
        this.salary = salary;
    }

    public String getPosition() {
        return position;
    }

    public int getSalary() {
        return salary;
    }
    public int getIncome() {
        return salary;
    }

    @Override
    public String toString(){
        return name + " " + surname + ", PESEL: " + pesel + " city: " + city + " position: " + position + " salray: " + salary + " PLN";
    }
}


public class Student extends Person {

    int group;
    int scholarship;

    public Student(String name, String surname, long pesel, String city, int group, int scholarship) {
        super(name, surname, pesel, city);
        this.group = group;
        this.scholarship = scholarship;
    }

    public int getGroup() {
        return group;
    }

    public int getScholarship() {
        return scholarship;
    }

    public int getIncome() {
        return scholarship;
    }

    @Override
    public String toString() {
        return name + " " + surname + ", PESEL: " + pesel + " city: " + city + " group: " + group + " scholarship: " + scholarship + " PLN";
    }
}

public class Test {
    public static void main(String[] args) {

        Person [] persons = new Person[4];
        persons[0] = new Student("Maciek", "Szczebla", 98012238475L, "Wrocław", 2, 750);
        persons[1] = new Student("Wojtek", "Okno", 98122557204L, "Bytom", 1, 650);
        persons[2] = new Employee("Albert", "Wiatr", 78031139475L, "Hel", "Fisherman", 4000);
        persons[3] = new Employee("Kazimierz", "Stonoga", 66092929364L, "Lublin", "Fireman", 4500);

        for (Person p : persons){
            System.out.println(p);
        }
    }
}
edytowany 1x, ostatnio: cerrato
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
3

Dziwne jest to salary jako int, ale OK :P
Dwie podpowiedzi:

  1. miejsce inome to chyba powinno być w klasie Person
  2. Potrzebna jest pętla (tutaj najbardziej pasuje for)

Zobacz pozostałe 14 komentarzy
KA
To słowem podsumowania, abym gafy potem gdzieś nie walnął. Typ double - wiadomo nie nadaje się do finansów bo cuda czasami wychodzą. Jeśli chodzi o mój przypadek czyli o pensje to typ int jest okey, czy lepiej użyć BigDecimal ?
YourFrog2
@KotAli To zależy co dalej. Używaj inta i niczym się nie przejmuj w podanym przykładzie. W przyszłości po prostu rób sobie rachunek czy ten int nie będzie problemem.
KamilAdam
int mieści tylko 21 milionów złotych (w groszach). Jakby to miała być wielkość rachunku bankowego to niektórym w Polsce mogłoby zabraknąć inta. Niestety nie mi :(
YourFrog2
@KamilAdam: Daj chłopakowi spokój bo się będzie zaraz martwić że mu long nie starcza :P Do reprezentacji pensji będzie aż nad to. Inne rzeczy jak reprezentacja rachunku bankowego może trzymać w longu albo nawet w BigInteger.
KA
Okay dzięki za wytłumaczenie :) Pozdrawiam :)
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 godziny
  • Postów:3539
4

@KotAli: ogólnie ja to bym zrobił trochę inaczej.

Pierwsza - dorzucił interfejs, np. Earner:

Kopiuj
interface Earner {
    int getIncome(); 
}

I potem dorzucił implementację do klas:

Kopiuj
public class Student extends Person implements Earner {
    // ... inny kod

    @Override 
    public int getIncome() {
        return scholarship;
    }
}

public class Employee extends Person implements Earner {
    // ... inny kod

    @Override
    public int getIncome() {
        return salary;
    }
}

I wtedy możesz sobie wrzucić instancje do tablicy:

Kopiuj
Earner[] earners = new Earner[4];
// ... dorzuć instancje

for (Earner r: earners) {
    int income = r.getIncome();
    // dorzuć logikę znajdującą najwyższą wypłatę
}

Druga opcja to po prostu potraktowanie przychodu jako własności osoby, tj.

Kopiuj
public Person(String name, String surname, long pesel, String city) {
    this.name = name;
    this.surname = surname;
    this.pesel = pesel;
    this.city = city;
}

public int getIncome() {
    return 0;
}

I potem tak jak wcześniej - tylko bez implementowania interfejsu.

edytowany 1x, ostatnio: wartek01
KA
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 lata
  • Postów:27
0

Zrobiłem to pierwszym sposobem i kicha. Próbowałem na różne sposoby... i z warunkami i instancjami w tablicy.
Jak to można naprawić te niezgodne typy ??
Literka "r" - zaznaczone w kodzie.
Incompatible types. Found: 'Zadanie727', required: 'int'

public class Test {
public static void main(String[] args) {

    Person[] persons = new Person[4];
    persons[0] = new Student("Maciek", "Szczebla", 98012238475L, "Wrocław", 2, 750);
    persons[1] = new Student("Wojtek", "Okno", 98122557204L, "Bytom", 1, 650);
    persons[2] = new Employee("Albert", "Wiatr", 78031139475L, "Hel", "Fisherman", 4000);
    persons[3] = new Employee("Kazimierz", "Stonoga", 66092929364L, "Lublin", "Fireman", 4500);

    for (Person p : persons) {
        System.out.println(p);
    }

    Earner[] earners = new Earner[4];
    earners[0] = new Student("Maciek", "Szczebla", 98012238475L, "Wrocław", 2, 750);
    earners[1] = new Student("Wojtek", "Okno", 98122557204L, "Bytom", 1, 650);
    earners[2] = new Employee("Albert", "Wiatr", 78031139475L, "Hel", "Fisherman", 4000);
    earners[3] = new Employee("Kazimierz", "Stonoga", 66092929364L, "Lublin", "Fireman", 4500);

    for (Earner r : earners) {
        int income = r.getIncome();
        if (earners[r] > income) { // tutaj wysakuje błąd na literce [r] - niezgodne typy
            income = r.getIncome();
        }
        System.out.println(income);
    }
}

}

Tasmanian Devil
"Twój post prawdopodobnie zawiera niesformatowany kod - nie wklejaj bezpośrednio kodu, ale obejmuj go w odpowiednie znaczniki! (jestem botem, ten komentarz został dodany automatycznie)"
VD
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Postów:72
1

@KotAli: Zwróć uwagę w których miejscach ustawiasz wartość zmiennej income. Robisz to w każdej iteracji pętli. Spróbuj ustawić wartość początkową przed pętlą, a w pętli zaktualizuj ją dopiero po sprawdzeniu, że aktualna jest większa od najwyższej.

KA
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 lata
  • Postów:27
0

Kiedy chce cokolwiek ustawić przed pętlą to też wyskakuje error. Program się wykrzacza. Zdaje sobie sprawę że przed pętlą powinna być jakaś wartość początkowa żeby od czegoś zacząć.

S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
1

Typie

Kopiuj
for (Earner r : earners) {
        int income = r.getIncome();
        if (earners[r] > income) { // tutaj wysakuje błąd na literce [r] - niezgodne typy
            income = r.getIncome();
        }
        System.out.println(income);
    }

Co Ty robisz tutaj? pobierasz earnera o indeksie earner xD
Albo robisz for eacha albo robisz fora na podstawie długości tablicy


p_agon
Earnerocepcja. Wrzucilbys gotowca a nie :P
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
3

To: for (Earner r : earners) przypisuje ci do r obiekt typu Earner
To: earners[r] > income jest źle, bo indeks tablicy to int a nie Earner pytanie po co odwołujesz się do całej tablicy, skoro już w r masz wszystko czego potrzebujesz i w dodatku linijkę wyżej pobierasz sobie i przypisujesz (bez sensu, ale to już inny problem) zarobki tego gostka?

Masz zrobić coś takiego:
zadeklarować zmienną Earner richest
w pętli sprawdzać, czy aktualny element nie zarabia więcej niż ten już przypisany, jeżeli to prawda, to przypisać aktualny element do zmiennej richest
jak cała pętla przejdzie, to do zmiennej richest masz przypisanego najlepiej zarabiającego gościa.

KA
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 lata
  • Postów:27
0

Gotowców nie chce. Po prostu się uczę i na razie na tym etapie banalne rzeczy są dla mnie trudne a dla was błahe. Mniejsza z tym.
Udało się, wypisało największą wartość wraz z imieniem. I pozostał chyba ostatni problem z wartością PESEL. Będzie się tak zdarzało że ktoś będzie miał PESEL który zaczyna się na 00......itd. Jak sobie poradzić z tym problemem ? Jakiegoś innego typu użyć do zmiennej PESEL ?

Kopiuj
public class Test {
    public static void main(String[] args) {

        Earner[] person = new Earner[5];
        person[0] = new Student("Maciek", "Szczebla", 98012238475L, "Wrocław", 2, 750);
        person[1] = new Student("Wojtek", "Okno", 98122557204L, "Bytom", 1, 1650);
        person[2] = new Employee("Albert", "Wiatr", 78031139475L, "Hel", "Fisherman", 5000);
        person[3] = new Employee("Kazimierz", "Stonoga", 66092929364L, "Lublin", "Fireman", 4500);
        person[4] = new Student("Magda", "Kachniarz", 88153329159L, "Warszawa", 5,20000); // Poprawić pesel bo jak jest 00.. to jest error;

        for (Earner r : person) {
            System.out.println(r);
        }

        int richest = person[0].getIncome();
        for (Earner earner : person) {
            if (earner.getIncome() > richest) {
                richest = earner.getIncome();
            }
        }
        for (int i = 0; i < person.length; i++) {
            if (richest == person[i].getIncome()) {
                System.out.println("\nNajwiększy dochód ma: " + person[i].getNameAndSurname() + " " + richest + " PLN");
            }
        }
    }
}
edytowany 5x, ostatnio: cerrato
Tasmanian Devil
"Twój post prawdopodobnie zawiera niesformatowany kod - nie wklejaj bezpośrednio kodu, ale obejmuj go w odpowiednie znaczniki! (jestem botem, ten komentarz został dodany automatycznie)"
H2
Wiem stary temat przegladam :) tutaj mozna zrobic jeszcze drobna optymalizacje, zamiast: int richest = person[0].getIncome(); dalbym Earner richest = person[0]; i pozamienial logike tak by tego ostatniego for loopa juz nie trzeba bylo robic.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
1

Numer PESEL powinien być moim zdaniem osobnym typem (klasą, którą powinieneś sobie sam stworzyć):

Kopiuj
public class Pesel{
private final String pesel;
   public Pesel(String pesel){
      //tutaj jakaś walidacja, długość, znaki, suma kontrolna
      this.pesel = pesel;
}

//nadpisanie metody toString z Object
   @Override
   public String toString(){
      return pesel;
   }
}
VD
Walidacja w konstruktorze też nie jest specjalnie fajna
piotrpo
Nic nie jest tu fajne bo cały ten problem da się ogarnąć .stream().max(), tak na dobry początek. Tylko OP się uczy i jak mu się zarzuci teraz fabryki, lambdy i inne ładniejsze wzorce, to jest spora szansa, że nie przetrwa.
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
3

Pesel powinien być stringiem. na razie nie ma potrzeby żebyś się przejmował VO.


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)