Obliczanie średniego wynagrodzenia

0

Witam, mam takie zadanko i "trochę" się z tym męczę.

Do programu dodaj funkcję wypisania średniej zarobków (bez bonusów) wszystkich pracowników:

Lista operacji:
1 - wypisz listę pracowników
2 - dodaj programistę
3 - dodaj kierownika
4 - usuń pracownika
5 - wypisz średnią zarobków
9 - zakończ program

Po wybraniu opcji 5, program powinien wyświetlić średnią w poniższym formacie:
Średnia zarobków: 2453,25zł
(wartość przypadkowa)

Dodałem archiwum z plikami dotyczącymi problemu, proszę o pomoc :)
Podejrzewam, że zadanko jest bardzo proste, ale to dopiero moje pierwsze kroki z programowaniem, dlatego chciałbym, żeby ktoś mi pokazał jak taki kod ma wyglądać żebym mógł sobie na spokojnie przeanalizować co i jak.

W załączniku zip z plikami do zadania.
Z góry bardzo dziękuje za pomoc i wyrozumiałość.

2

Że też 4 osoby ściągnęły zipa xd wklej tutaj kod w post, więcej osób pomoże

0

Wrzucę to w trzech częściach, także tak

package pl.edu.wsiz.io11.part2;

import java.util.Scanner;

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

        Scanner scanner = new Scanner(System.in);
        Company company = new Company();

        company.addEmployee(new Developer("Jan", "Kowalski", (byte) 31, Sex.MALE, 3000, new String[]{"HTML"}));
        company.addEmployee(new Manager("Anna", "Kowalczyk", (byte) 27, Sex.FEMALE, 3200, new String[]{"Java", "CSS"}, 2));
        company.addEmployee(new Developer("Piotr", "Nowak", (byte) 36, Sex.MALE, 2800, new String[]{"CSS", "PHP"}));

        int operationNumber;
        do {
            System.out.println("Lista operacji:\n");
            System.out.println("1 - wypisz listę pracowników");
            System.out.println("2 - dodaj programistę");
            System.out.println("3 - dodaj kierownika");
            System.out.println("4 - usuń pracownika");
            System.out.println("9 - zakończ program\n");

            System.out.print("Podaj numer operacji: ");
            operationNumber = scanner.nextInt();

            switch (operationNumber) {
                case 1:
                    company.printEmployees();
                    break;
                case 2:
                    company.addDeveloper();
                    break;
                case 3:
                    company.addManager();
                    break;
                case 4:
                    System.out.print("Podaj numer pracownika do usunięcia: ");
                    int employeeNumber = scanner.nextInt();
                    company.removeEmployee(employeeNumber);
                    break;
                case 9:
                    // nic nie rób (zakończ pętlę)
                    break;
                default:
                    System.out.println("Operacja o podanym numerze nie istnieje!");
            }

        } while (operationNumber != 9);
    }
}
0

Drugi i trzeci jednak razem bo nie wiedziałem, że cooldown jest :<

part2

package pl.edu.wsiz.io11.part2;

import java.util.Scanner;

public abstract class Employee {
    private String firstname;
    private String lastname;
    private byte age;
    private Sex sex;
    private int salary;
    private String[] skills;

    public Employee(String firstname, String lastname, byte age, Sex sex, int salary, String[] skills) {
        this.firstname = firstname;
        this.lastname = lastname;
        this.age = age;
        this.sex = sex;
        this.salary = salary;
        this.skills = skills;
    }

    public boolean isEqual(Employee employee) {
        return firstname.equalsIgnoreCase(employee.firstname) &&
                lastname.equalsIgnoreCase(employee.lastname) &&
                age == employee.age;
    }

    public void print() {
        System.out.println(this);
    }

    public static void print(Employee employee) {
        employee.print();
    }

    @Override
    public String toString() {
        char sexChar = this.sex == Sex.FEMALE ? 'K' : 'M';
        String skillsStr = String.join(", ", skills);

        return String.format("%c %s %s %d %c %dzł [%s]", getJobSymbol(), firstname, lastname, age, sexChar, salary, skillsStr);
    }

    protected static String readFirstname() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Podaj imię:      ");

        return scanner.next();
    }

    protected static String readLastname() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Podaj nazwisko:  ");

        return scanner.next();
    }

    protected static byte readAge() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Podaj wiek:      ");

        return scanner.nextByte();
    }

    protected static Sex readSex() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Podaj płeć:      ");
        String sexStr = scanner.next();

        return sexStr.toUpperCase().charAt(0) == 'K' ? Sex.FEMALE : Sex.MALE;
    }

    protected static int readSalary() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Podaj zarobki:   ");
        int salary = scanner.nextInt();
        scanner.nextLine();

        return salary;
    }

    protected static String[] readSkills() {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Podaj umiejętności: ");
        String skillsStr = scanner.nextLine();

        String[] skillsArr = skillsStr.split(",");

        for (int i = 0; i < skillsArr.length; i++) {
            skillsArr[i] = skillsArr[i].trim();
        }

        return skillsArr;
    }

    protected abstract char getJobSymbol();
}

part3

package pl.edu.wsiz.io11.part2;

import java.util.ArrayList;

public class Company {
    private ArrayList<Employee> employeesArrayList = new ArrayList<>();

    public void addEmployee(Employee employee) {
        if (isAlreadyOnTheList(employee)) {
            System.out.println("Pracownik o tych samych danych znajduje się już na liście!");
            return;
        }

        employeesArrayList.add(employee);
    }

    public void addDeveloper() {
        addEmployee(Developer.read());
    }

    public void addManager() {
        addEmployee(Manager.read());
    }

    public void removeEmployee(int number) {
        if (number < 1 || number > employeesArrayList.size()) {
            System.out.println("Lista nie zawiera pracownika o podanym numerze porządkowym.");
            return;
        }
        employeesArrayList.remove(number - 1);
    }

    private boolean isAlreadyOnTheList(Employee employee) {
        for (Employee tmpEmployee : employeesArrayList) {
            if (tmpEmployee.isEqual(employee)) {
                return true;
            }
        }

        return false;
    }

    public void printEmployees() {
        System.out.println("--------------------");

        int number = 1;
        for (Employee employee : employeesArrayList) {
            System.out.print(number++ + "  ");
            employee.print();
        }

//        for (Employee employee : employeesArrayList) {
//            System.out.print(employeesArrayList.indexOf(employee) + 1 + "  ");
//            employee.print();
//        }

//        for (int i = 0; i < employeesArrayList.size(); i++) {
//            System.out.print(i + 1 + "  ");
//            employeesArrayList.get(i).print();
//        }

        System.out.println("--------------------");
    }
}
1
  1. Enum Sex zrób Yes/No. :D
    A tak serio - zamień to na Gender, bo dziwnie wygląda.

  2. Funkcje typu:

private static int readTeamSize() {
    Scanner scanner = new Scanner(System.in);

    System.out.print("Podaj rozm. zespołu: ");

    return scanner.nextInt();
}

powinny raczej dostawać Scanner z zewnątrz (i ew. akceptować w parametrach prompt - tekst "Podaj x...").
Najlepiej jakby to wywalić poza klasę ale to się kłóci z tym co promuje Yegor.

  1. A samą średnią już bardziej standardowo możesz policzyć tak (nie znam na tyle stylu Yegora żeby to zrobić tak jak on):
class Employee {
	final int salary;
 
	public Employee(int salary) {
		this.salary = salary;
	}
}
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		Employee[] employees = new Employee[] { new Employee(22), new Employee(13), new Employee(5) };
		double avg = calcAverage(employees);
		System.out.println(avg);
	}
 
	private static double calcAverage(Employee[] employees) {
	   double sum = Arrays.stream(employees).map(e -> e.salary).reduce(0, (a, b) -> a + b);	
	   return sum / employees.length;
	}
}

przykład

0

@vpiotr: nie jestem bezpośrednim autorem tego kodu :D ale faktycznie dziwne to jak sie tak przyjrzeć

2

Coś na kształt:

return employeesArrayList.stream().mapToDouble(employee -> employee.salary).average().orElse(0.0);

Powinno dać radę. Czyli ~to samo co napisał @vpiotr, ale trochę prościej.

--dodana zmiana z komentarza @wartek01

1 użytkowników online, w tym zalogowanych: 0, gości: 1