2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Расчет зп сотрудников предприятия - C++
Сообщение10.03.2017, 16:54 
Аватара пользователя


05/08/11
36
Калининград
Здравствуйте. Помогите, пожалуйста разработать приложение. Если коротко, то задача такая: есть предприятия с сотрудниками трех видов (manager, disigner, programmer), у каждого типа работника свои правила, по которым растет их зп. У менеджера - это процента за год стажа. У дизайнера- процент за стаж + полпроцента за всех его подчиненных. У программиста - процента за стаж + полпроцента за всех его подчиненных первого уровня. Нужно написать программу, которая бы рассчитывала зарплату любого сотрудника или сразу всех.
В принципе задача не сложная, но у меня возникло несколько трудностей. Первая трудность в том, что я не представляю где хранить информацию о том, сколько сотрудников на кого работает и информацию об их уровне. Вторая это то, что приложение надо написать на Qt с использованием SQLLite, с ними я только начал разбираться.
Я написал базовый, абстрактный класс и реализацию класса менеджера.

Используется синтаксис C++
//worker.h
 
class Worker
{
protected:
    std::string name;
    Date dateOfReceipt;
    int baseSalary;
 
public:
    Worker(const std::string& nm, const Date& dt, const int salary)
        : name(nm), dateOfReceipt(dt), baseSalary(salary) {}
 
    virtual double calculateSalary(const Date& dateOfCalcuation) = 0;
};


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

 Профиль  
                  
 
 Re: Расчет зп сотрудников предприятия - C++
Сообщение10.03.2017, 17:09 
Заслуженный участник


02/08/11
7013
Alex Fox в сообщении #1198792 писал(а):
Первая трудность в том, что я не представляю где хранить информацию о том, сколько сотрудников на кого работает и информацию об их уровне.
Я бы отталкивался вот от этого:
Alex Fox в сообщении #1198792 писал(а):
с использованием SQLLite
Соответствеено, первый вопрос - каким именно образом вы будете работать с SQLite? Надо ли вам вообще хранить где-то в программе какую-то информацию? Зачем?

 Профиль  
                  
 
 Re: Расчет зп сотрудников предприятия - C++
Сообщение10.03.2017, 17:23 
Аватара пользователя


05/08/11
36
Калининград
warlock66613 в сообщении #1198799 писал(а):
каким именно образом вы будете работать с SQLite?

Я не знаю какой будет иметь вид БД пользователя, поэтому хотел сделать максимально независимую от нее реализацию. Но из-за того, что нужно знать еще и иерархию, то скорее всего придется всю необходимую информацию внести в БД, в программе же создавать соответствующие экземпляры, которые знают свое имя, дату поступления и базовую ставку, а так же берут из таблицы количество всех подчиненных и подчиненных первого уровня.

 Профиль  
                  
 
 Re: Расчет зп сотрудников предприятия - C++
Сообщение10.03.2017, 18:49 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
Alex Fox в сообщении #1198792 писал(а):
Первая трудность в том, что я не представляю где хранить информацию о том, сколько сотрудников на кого работает и информацию об их уровне. Вторая это то, что приложение надо написать на Qt с использованием SQLLite, с ними я только начал разбираться.
Ну если в задании сказано, что надо использовать SQLLite, очевидно, что в нем и надо хранить информацию. У вас как с этим? Схема БД есть уже? DDL таблиц?

Alex Fox в сообщении #1198792 писал(а):
Хранить указатели на подчиненных работников или написать отдельный класс, который бы хранил всю иерархию предприятия?
Обычно в реляционных БД иерархии хранятся в таблицах вида:
Используется синтаксис SQL
CREATE TABLE employee (
id NUMBER,
parent_id NUMBER,
employee_name varchar2(100),
... /*остальные поля*/
);
(синтаксис оракловый, извините)
ID - первичный ключ (номер сотрудника)
PARENT_ID - внешний ключ (ссылающийся на ID той же таблицы), ссылка на начальника. Для извлечения данных можно использовать иерархические запросы (SQLLite их поддерживает). Как - думаю, самостоятельно нагуглите (hierarchical query это называется).

 Профиль  
                  
 
 Re: Расчет зп сотрудников предприятия - C++
Сообщение10.03.2017, 19:26 
Аватара пользователя


05/08/11
36
Калининград
Цитата:
Схема БД есть уже?

На данный момент я ее так представляю:
Используется синтаксис SQL
CREATE TABLE employees(id INTEGER PRIMARY KEY AUROINCREMENT, parent_id INTEGER, name TEXT, receipt_date TEXT, occupy TEXT, salary NUMERIC

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

 Профиль  
                  
 
 Re: Расчет зп сотрудников предприятия - C++
Сообщение10.03.2017, 19:29 
Заслуженный участник


02/08/11
7013
Alex Fox в сообщении #1198802 писал(а):
Я не знаю какой будет иметь вид БД пользователя, поэтому хотел сделать максимально независимую от нее реализацию.
Собственно алгоритм расчёта можно сделать независимым от способа хранения данных вообще: для этого метод расчёта делается шаблонным, и в него параметрами передаются лямбды (std::function<int(T)> getEmployeesCount и т. п.), используя которые алгоритм и получает необходимую информацию. А вот остальная часть программы как ни крути как раз на БД завязана.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group