Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: класс Бухгалтер (Java)  (Прочитано 17341 раз)
0 Пользователей и 1 Гость смотрят эту тему.
jackson
Участник

ua
Offline Offline

« : 07-11-2011 20:16 » 

Доброго времени суток! Опыт программирования на java у меня практически нулевой,но столкнулся с задачей,которую необходимо реализовать:


Создать абстрактный класс Сотрудник. У него должны быть методы для задания ставки (з/п в месяц при 100% отработки), количества отработанных часов, а также методы для получения процента отработанного времени и зарплаты за месяц.
Сотрудники могут быть двух типов: Программист и Менеджер. Программист получает зарплату в соответствии с количеством отработанных часов, а менеджер - 100% в случае переработки и соответствующий процент в случае недоработки.
Класс Бухгалтер принимает множество сотрудников и считает их з/п. Для него должно быть прозрачным, какого типа является сотрудник. Ему важна только зарплата за текущий месяц.
Создать нужно 4 класса: сотрудник,менеджер,программист,бухгалтер.


класс сотрудник,менеджер и программист я создал,но не понимаю, нафиг нужен класс бухгалтер,если у меня зарплата считается в менеджере и программисте,но класс "бухгалтер" должен быть обязательно;класс бухгалтер должен наследовать сотрудника или не обязательно?как вообще подсчёт зарплаты в этом классе организовать?Заранее спасибо за советы.
Вот собственно то,что я уже набросал:

Код: (Java)
abstract class Employee
{
        private int ID;
        public String name;
        public String role;
        public int FixedSalary;
        public int worckedHours;
        public Employee()
        {
                ID++;
        }
        public final int getID()
        {
                return ID;
        }
        public void setName(String name)
        {
                this.name=name;
        }
        public void setRole(String role)
        {
                this.role=role;
        }
        public int setFixedSalary(int FixedSalary)
        {
                return this.FixedSalary=FixedSalary;
        }
        public int setWorckedHours(int worckedHours)
        {
                return this.worckedHours=worckedHours;
        }
        public int getWorckedHours()
        {
                return worckedHours;
        }
        public int getFixedSalary()
        {
                return this.FixedSalary;
        }
        public String getName()
        {
                return name;
        }
        public String getRole()
        {
                return role;
        }
 
        public abstract int getPercent();
        public abstract int getFullSalary();
       
}

Код: (Java)
class Developer extends Employee
 {
         static private  final  int HOURS_FOR_MONTH = 160;
         static private  final  int MAX_SALARY=5000;
         public  int getPercent()
         {
                 return getWorckedHours()*100/HOURS_FOR_MONTH;
         }
         public  int getFullSalary()
         {
                 return getFixedSalary()*100/MAX_SALARY;
         }
 }

Код: (Java)
class Manager extends Employee
 {
         static private  final  int HOURS_FOR_MONTH = 160;
         static private  final  int MAX_SALARY=4000;
         public  int getPercent()
         {
                 if(getWorckedHours()>HOURS_FOR_MONTH)
                 {
                         return 100;
                 }
                 return getWorckedHours()*100/HOURS_FOR_MONTH;
         }
         public  int getFullSalary()
         {
                 return getFixedSalary()*100/MAX_SALARY;
         }
 }
« Последнее редактирование: 08-11-2011 15:34 от Джон » Записан
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 08-11-2011 00:08 » 

Цитата
... но класс "бухгалтер" должен быть обязательно;класс бухгалтер должен наследовать сотрудника или не обязательно?
Так это вопросы к постановщику задачи - что дальше планируется с этими классами?
По идее бухгалтер тоже должен получать з/п (голую ставку), но в отличии от программиста - он имеет доступ к з/п других сотрудников.
ИМХО начинать нужно с прорисовки (хотя бы общих чертах) полной модели приложения
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 08-11-2011 06:38 » 

Цитата
нафиг нужен класс бухгалтер,если у меня зарплата считается в менеджере и программисте
Ну, как один из вариантов, программист может не сам считать зарплату, а запрашивать её у бухгалтера. Мало ли, ему менеджер премию выписал Улыбаюсь

Но в целом, согласен с Kivals: надо понимать, как эти все сущности друг с другом связаны, построить модель этого взаимодействия (например, как появляется новый сотрудник - регистрируется у бухгалтера? у менеджера?).
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 08-11-2011 08:52 » 

Цитата: jackson
но не понимаю, нафиг нужен класс бухгалтер,если у меня зарплата считается в менеджере и программисте
Правильный вопрос: а почему у тебя зарплата считается в менеджере и программисте? Разве IRL это так? Разве IRL они считают свою зарплату и сообщают её бухгалтеру?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
jackson
Участник

ua
Offline Offline

« Ответ #4 : 08-11-2011 09:27 » 

как вариант,я думаю,методы подсчёт зарплаты и процента отработанного времени нужно в классах программист и менеджер сделать абстрактными(так как эти методы наследуются ими из класса сотрудник),а в классе бухгалтер создать метод подсчёта зарплаты и принимать в этот метод параметр типа Сотрудник. Далее он должен через instanceof проверять, какого типа этот сотрудник - программист или менеджер, и в зависимости от этого высчитывать процентную ставку.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-11-2011 09:50 » 

Не понимаю чем отличается Сотрудник, Менеджер, программист, бухгалтер друг от друга, кроме кк обязанностей и методов начисления зарплаты.
Сотрудник - Личные данные - 
Программист -сотрудник-зарплата-(метод начисления)отработанное время-доступ разрешен только к просмотру зарплаты самого себя.
Менеджер -сотрудник-зарплата-(Метод начисления)отработанное время-доступ разрешен к редактированию з/пл программиста, запрещен к изменению самого себя - только просмотр
Бухгалтер - сотрудник -зарплата-(метод начисления) - доступ разрешен к изменению/начислению зарплаты всех сотрудников

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
jackson
Участник

ua
Offline Offline

« Ответ #6 : 08-11-2011 09:56 » 

это понятно;мне только не совсем понятно,как  организовать сам подсчёт в классе бухгалтер
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 08-11-2011 10:20 » 

А кто сказал что это должно делаться в классе бухгалтера.
Доступ к начислению может иметь только бухгалтер
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
jackson
Участник

ua
Offline Offline

« Ответ #8 : 08-11-2011 10:24 » 

вобще-то в задании сказано,что в бухгалтер считает зарплату
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 08-11-2011 10:26 » 

А я говорю что-то другое?

Ладно создавай класс бухгалтер, а внем метод - считать зряплату, на вход поступают все сотрудники.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
jackson
Участник

ua
Offline Offline

« Ответ #10 : 08-11-2011 10:28 » 

протупил)
да я уже,в общем-то,так и собираюсь сделать)
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 08-11-2011 10:35 » 

Я тебе даже по секрету скажу.
Зарплату должен начислять не бухгалтер, а сотрудник с определенным табельным номером, и пусть он будет хоть паровозом, но он имеет право начислять зарплату. Улыбаюсь

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
jackson
Участник

ua
Offline Offline

« Ответ #12 : 08-11-2011 13:26 » 

в общем получилась такая прога:
Код: (Java)
abstract class Employee
{
        private int ID;
        public String name;
        public String role;
        public int Salary;
        public int worckedHours;
       
        public void setName(String name)
        {
                this.name=name;
        }
        public void setRole(String role)
        {
                this.role=role;
        }
        public int setSalary(int Salary)
        {
                return this.Salary=Salary;
        }
        public int setWorckedHours(int worckedHours)
        {
                return this.worckedHours=worckedHours;
        }
        public int getWorckedHours()
        {
                return worckedHours;
        }
        public int getSalary()
        {
                return this.Salary;
        }
        public String getName()
        {
                return name;
        }
        public String getRole()
        {
                return role;
        }
 
        public abstract float getPercent();
        public abstract float getFullSalary();
Код: (Java)
 class Developer extends Employee
 {
         static private  final  int HOURS_FOR_MONTH = 160;
         
         public  float getPercent()
         {
                 return getWorckedHours()*100/HOURS_FOR_MONTH;
         }
         
         public  float getFullSalary()
         {
                 return (getSalary()/HOURS_FOR_MONTH)*getWorckedHours();
         }
 }
Код: (Java)
class Manager extends Employee
 {
         static private  final  int HOURS_FOR_MONTH = 160;
         
         public  float getPercent()
         {
                 if(getWorckedHours()>HOURS_FOR_MONTH)
                 {
                         return getSalary();
                 }
                 return getWorckedHours()*100/HOURS_FOR_MONTH;
         }
         public  float getFullSalary()
         {
                 
                 return (getSalary()/HOURS_FOR_MONTH)*getWorckedHours();
         }
 }
Код: (Java)
class Accountant
{
       
       
         public float calculateFullSalary (Employee[] employers)
            {
                float sum=0;
                for (Employee emp : employers)
                    sum=emp.getFullSalary();
                return sum ;
            }
       
}
Код: (Java)
public abstract class salar {

        /**
         * @param args
         */

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Developer developer = new Developer();
                Manager manager = new Manager();
                Accountant accountant = new Accountant();
                developer.setName("Fedor");
                developer.setRole("Developer");
                developer.setSalary(3000);
                developer.setWorckedHours(100);
                manager.setName("Ivan");
                manager.setRole("Manager");
                manager.setSalary(4200);
                manager.setWorckedHours(120);
                Employee[] emp = new Employee[]{developer, manager};
                accountant.calculateFullSalary(emp);
                System.out.println("Данные о сотрудниках:");
                System.out.println("Имя:"+developer.getName()+"Должность:"+developer.getRole()+"Количество отработанных часов:"+developer.getWorckedHours()+"Фиксированная ставка:"+developer.getSalary()+"Зарплата за месяц:"+accountant.calculateFullSalary(emp));
                System.out.println("************************************************************");
                System.out.println("Имя:"+manager.getName()+"Должность:"+manager.getRole()+"Количество отработанных часов:"+manager.getWorckedHours()+"Фиксированная ставка:"+manager.getSalary()+"Зарплата за месяц:"+accountant.calculateFullSalary(emp));
               

        }

}
и такой вывод:
-----------------
Данные о сотрудниках:
Имя:FedorДолжность:DeveloperКоличество отработанных часов:100Фиксированная ставка:3000Зарплата за месяц:3120.0
************************************************************
Имя:IvanДолжность:ManagerКоличество отработанных часов:120Фиксированная ставка:4200Зарплата за месяц:3120.0
---------------

не могу понять, в чём проблема?
« Последнее редактирование: 08-11-2011 15:34 от Джон » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 08-11-2011 14:34 » 

С самого начала хотел спросить, а почему некоторые сеттеры что-то возвращают?

Теперь по вопросу.

то это?
float sum=0;
           for (Employee emp : employers)
               sum=emp.getFullSalary();

а где сама сумма?

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 08-11-2011 14:40 » 

Потому что пляшете не от той печки, потому так и выходит.

В чём задача? Посчитать зарплату. Выполнять эту задачу должен бухгалтер. Есть какие-то сотрудники, для которых по-разному считаются зарплаты.

Классификации должны подвергаться не сотрудники, а методы начисления зарплаты. Примеры: оклад, сдельная, разные виды премирования и надбавок - и т.д. У сотрудников должны быть возможность хранить внутри себя список всех видов начислений, которые к данному сотруднику применяются. Это же и даёт гибкость в управлении кадрами - можно сотруднику изменить порядок начисления тех же премий без всяких модификаций исходного кода, просто заменив один экземпляр на другой.

Называется это всё шаблон проектирования "стратегия".

Задача бухгалтера, таким образом, сводится к тому, чтобы перебрать всех сотрудников, а у каждого сотрудника - все его зарплатные "опции" вычислить, просуммировать и вывести в какой-нибудь табель.

Особый момент здесь тот, что разные стратегии зависят от разных атрибутов сотрудников: для каких-то расчётов нужно знать количество рабочих часов в месяц, для других, например, - сумму сделок, заключённых менеджером по продажам, для третьих - отклонение от каких-то нормативных показателей.

Поэтому помимо классификации по видам начислений ещё нужна классификация по видам данных, необходимых для применения стратегий.

P.S. Тему в "Технологии разработки ПО".
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
jackson
Участник

ua
Offline Offline

« Ответ #15 : 08-11-2011 14:42 » 

с сеттерами тупанул,уже исправил;
sum это переменная для хранения зарплаты,просто надо было по-другому её назвать

Добавлено через 3 минуты и 18 секунд:

Dimka,спасибо за совет)
« Последнее редактирование: 08-11-2011 14:45 от jackson » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 08-11-2011 14:55 » 

я указал на ошибку

accountant.calculateFullSalary(emp); ---- Здесь она непраильно считается
ПОСЧИТАЛИ всех
 ..... accountant.calculateFullSalary(emp));
System.out.println("************************************************************");
..... accountant.calculateFullSalary(emp));
      
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
jackson
Участник

ua
Offline Offline

« Ответ #17 : 08-11-2011 14:58 » 

а как её исправить?
просто я в джаве пока ещё полный нубяра,пока не доганяю
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 08-11-2011 15:07 » 

хм... я в jave уще полнее НОЛЬ Улыбаюсь
А что там исправлять, ты что не сам код писал?
Тогда, Димка просил в Технологии, а я прошу к Начинающим Улыбаюсь

sum=0
for i=1 to N {
  sum = sum + i
}

У тебя код расчета общей зарплаты похож на это?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
jackson
Участник

ua
Offline Offline

« Ответ #19 : 08-11-2011 15:10 » 

нет.не похож)

Добавлено через 1 минуту и 27 секунд:
чёто я в цикл не совсем въехал...
а куда мне тогда девать for (Employee emp : employers)?
« Последнее редактирование: 08-11-2011 15:12 от jackson » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 08-11-2011 15:14 » 

как ты думаешь, как работает это цикл? Я догадываюсь

Он пробегает по каждому члену коллекции
 но не  суммирует
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 08-11-2011 16:32 » new

Цитата: Sla
Тогда, Димка просил в Технологии, а я прошу к Начинающим
Ну ежели автору даже цикл непонятен, то, конечно, какие тут стратегии.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines