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:ponad 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:mniej niż minuta
  • Postów:3615
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:10 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:ponad 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:5 dni
  • 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:5 dni
  • 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:ponad 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
3

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


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.