Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 22.05.2012
Сообщений: 35

Зарплата начальника зависящая от зарплаты подчиненных всех уровней

12.06.2018, 00:14. Показов 1252. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна помощь!!! Второй день сижу, ничего не могу придумать
У меня есть база данных, в которой есть сотрудники и начальники. Если сотрудник подчиняется начальнику, то его "pid" равен "id" начальника. Мне нужно высчитать зарплату начальника, зависящую от подчиненных всех уровней.
Если зарплата зависит только от подчиненного 1 уровня я сделал следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public double CalculateSalary(string dbfile, int id)
        {
            Information information = new Information(dbfile);
            List<ListWithName> InformationColumn = information.GenEntries("id,Name,Date,Salary,pid"); //получаем из таблицы данные
            DateTime begindate = DateTime.Parse("12.12.1999");
            DateTime enddate = DateTime.Parse("13.12.2002");
            int yearswork = NumberYears(begindate, enddate); //прошедшее количество лет
            double Salary = Convert.ToInt32(InformationColumn[id - 1].SubItems[3]) + Convert.ToInt32(InformationColumn[id - 1].SubItems[3]) * yearswork * 0.03;
            for (int i = 0; i < InformationColumn.Count; i++)
            {
                if (InformationColumn[i].SubItems[4] == id.ToString())
                {
                    Salary += CalculateSalary(dbfile, Convert.ToInt16(InformationColumn[i].SubItems[0]))*0.003;
                }
            }
            return Salary;
        }
а вот как сделать для всех уровней не могу придумать, уже всю голову сломал...

Добавлено через 12 минут
Думал передавать список с добавление подчиненных и по нему пробегать, но не могу придумать как правильно это сделать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public double CalculateSalary2(string dbfile, int id, List<double> Salary1)
        {
            Information information = new Information(dbfile);
            List<ListWithName> InformationColumn = information.GenEntries("id,Name,Date,Salary,pid");
            DateTime begindate = DateTime.Parse("12.12.1999");
            DateTime enddate = DateTime.Parse("13.12.2002");
            int yearswork = NumberYears(begindate, enddate);
            double Salary = Convert.ToInt32(InformationColumn[id - 1].SubItems[3]) + Convert.ToInt32(InformationColumn[id - 1].SubItems[3]) * yearswork * 0.03;
            for (int i = 0; i < InformationColumn.Count; i++)
            {
                if (InformationColumn[i].SubItems[4] == id.ToString())
                {
                    Salary += CalculateSalary2(dbfile, Convert.ToInt16(InformationColumn[i].SubItems[0]), Salary1)*0.003;
                    foreach (double j in Salary1)
                    {
                        Salary += j * 0.003;
                    }
                }
            }
            Salary1.Add(Salary);
            return Salary;
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.06.2018, 00:14
Ответы с готовыми решениями:

StringGrid: найти работника, зарплата которого наиболее отклоняется средней зарплаты всех работников
Помогите пожалуйста!!! Нужно найти работника, зарплата которого наиболее отклоняется средней зарплаты всех работников. Вот таблица : ...

Зная зарплаты всех работников, найти на сколько наименьшая зарплата на предприятии отличается от наибольшей
* На малом предприятии работает определенное количество работников, но не менее двух – директора и главного бухгалтера. Зная зарплаты всех...

Найдите фамилию работника, зарплата которого наименее отклоняется от средней зарплаты всех работников за текущий месяц
Ведомость на зарплату представлена как две таблицы. Одна содержит фамилии работников цеха, а вторая — их зарплату за текущий месяц: ...

7
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
12.06.2018, 10:02
YaOnline,
Вам нужно преобразовать вашу плоскую модель DB в дерево. А в дереве уже делать необходимые расчеты.
Алгоритм преобразования плоской БД в дерево здесь.
0
2 / 2 / 0
Регистрация: 22.05.2012
Сообщений: 35
12.06.2018, 12:44  [ТС]
Storm23, Не могли бы вы подробнее рассказать, вот у меня есть список:
C#
1
 List<ListWithName> InformationColumn = information.GenEntries("id,Name,Date,Salary,pid");
как этот список преобразовать в дерево по pid, который указывает на id родителя?

Добавлено через 17 минут
InformationColumn[i].SubItems[0] - id
InformationColumn[i].SubItems[1] - Name
...
InformationColumn[i].SubItems[4] - pid

Добавлено через 1 час 1 минуту
Пытаюсь делать по аналогии, но не получается:
C#
1
2
3
4
5
6
7
8
9
10
11
12
class TreeNode : IEnumerable<TreeNode>
    {
        static Information information = new Information("database.db");
        List<ListWithName> InformationColumn = information.GenEntries("id,Name,Date,Salary,pid");
        public DataRow Row { get; set; }
        public IEnumerator<TreeNode> GetEnumerator(int id)
        {
            if (Row == null)
                return InformationColumn[id - 1].SubItems[0]; // не могу здесь сделать
 
        }
    }
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
12.06.2018, 14:19
YaOnline,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
static class Repository
{
    static Information information = new Information("database.db");
    public static List<ListWithName> Rows = information.GenEntries("id,Name,Date,Salary,pid");
}
 
class TreeNode : IEnumerable<TreeNode>
{
    public ListWithName Row { get; set; }
 
    public IEnumerator<TreeNode> GetEnumerator()
    {
        if (Row == null)
            return Repository.Rows.Select(r => new TreeNode() { Row = r }).GetEnumerator();
 
        var id = Row.SubItems[0];//id
        return Repository.Rows.Where(r => r.SubItems[4]/*pid*/ == id).Select(r => new TreeNode() { Row = r }).GetEnumerator();
    }
    
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
 
    public override bool Equals(object obj)
    {
        var other = obj as TreeNode;
        if (other == null) return false;
        if (Row == other.Row) return true;
        return Row.SubItems[0] == other.Row.SubItems[0];//ids
    }
 
    public override int GetHashCode()
    {
        if (Row == null) return 0;
        return (int)Row.SubItems[0];//id
    }
 
    public override string ToString()
    {
        return Row == null ? "root" : Row.SubItems[1];//name
    }
}
1
2 / 2 / 0
Регистрация: 22.05.2012
Сообщений: 35
12.06.2018, 14:30  [ТС]
Storm23, спасибо большое Вам, но к сожалению это не работает, почему то нет методов Select и Where и TreeNote не реализует член интерфейса
Миниатюры
Зарплата начальника зависящая от зарплаты подчиненных всех уровней   Зарплата начальника зависящая от зарплаты подчиненных всех уровней  
0
2 / 2 / 0
Регистрация: 22.05.2012
Сообщений: 35
13.06.2018, 17:54  [ТС]
Storm23, знаю, что я Вас вчера достал, но подскажите пожалуйста по поводу данного момента:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
 
            //load db
            Repository.LoadDataSet();
 
            //build tree
            ftMain.Build(new TreeNode());
        }
 
        private void ftMain_DoubleClick(object sender, EventArgs e)
        {
            var node = ftMain.SelectedNode as TreeNode;
            if (node != null)
            {
                //create edit form
                var form = new InputForm() {MdiParent = this};
                //after form closed - rebuild myself
                form.FormClosed += (o, O) =>
                {
                    if (form.DialogResult == DialogResult.OK)
                        Build();
                };
                //build edit form
                form.Build(node.Row);
                //show edit form
                form.Show();
            }
        }
 
        private void Build()
        {
            ftMain.Rebuild();
        }
    }

1. Для расчета зарплаты мне, по идее, не нужно выводить дерево на форму, или нужно?
2. Как тогда сделать, создать в классе произвольную форму?
3. Если да, то как загрузить в нее дерево, только с использованием FastTree, или можно как то так:
C#
1
2
3
4
5
6
7
8
9
class Salary
    {
        Form from = new Form(new TreeNode);
        public void CalculateSalary()
        {
            var form = form { MdiParent = this };
        }
 
    }
правда это не работает, т.к. я не могу в новую форму передать TreeNode. Как это сделать, создать конструктор или по другому как-то передавать?

Добавлено через 1 час 14 минут
Storm23, прошлым сообщением написал глупость, разобрался

Добавлено через 1 час 2 минуты
Storm23,
Не могли бы Вы подсказать, как сделать чтобы в List записывались только зарплаты всех подчиненных разных уровней, которые подчиняются именно ему
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Salary
    {
        static Information information = new Information("database.db");
        List<ListWithName> InformationColumn = information.GenEntries("*");
        TreeNode tree = new TreeNode();
        public void CalculateSalary(int id)
        {
            tree.Row = InformationColumn[id - 1];
            List<string> List = new List<string>();
            foreach (TreeNode a in tree)
            {
                CalculateSalary(Convert.ToInt16(a.Row.SubItems[0]));
                List.Add(a.Row.SubItems[4]);
                MessageBox.Show(a.ToString());
                foreach(string b in List)
                {
                    MessageBox.Show(b);
                }
            }
        }
    }
в данном случае он записывает зарплаты подчиненных одного уровня

Добавлено через 56 минут
Сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Salary
    {
        static Information information = new Information("database.db");
        List<ListWithName> InformationColumn = information.GenEntries("*");
        TreeNode tree = new TreeNode();
        public void CalculateSalary(int id, List<string> List)
        {
            tree.Row = InformationColumn[id - 1];
            List<string> List1 = new List<string>();
            foreach (TreeNode a in tree)
            {
                CalculateSalary(Convert.ToInt16(a.Row.SubItems[0]), List1);
                List.Add(a.Row.SubItems[4]);
            }
            List.Add(InformationColumn[id - 1].SubItems[4]);
            MessageBox.Show(InformationColumn[id - 1].SubItems[1].ToString());
            foreach (string b in List1)
            {
                MessageBox.Show(b);
            }
        }
    }
но он захватывает только 2 уровня
0
 Аватар для kesean
292 / 291 / 108
Регистрация: 04.09.2010
Сообщений: 638
13.06.2018, 22:03
YaOnline, попробуй простую рекурсию:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        static void Main(string[] args)
        {
            DataTable dt = CreateTable(); //Get from database
            foreach(DataRow dr in dt.Rows)
            {
                Console.WriteLine($"{dr["name"]} salary = {GetSalary(Convert.ToInt32(dr["id"]), dt)}");
            }
            Console.ReadLine();
        }
        static DataTable CreateTable()
        {
            DataTable t = new DataTable();
            t.Columns.Add("id");
            t.Columns.Add("pid");
            t.Columns.Add("name");
            t.Columns.Add("salary");
 
            t.Rows.Add(t.NewRow().ItemArray = new object[] { 1, null, "boss level 0 (employee all)", 0 }); // must 230+1200=1530
            t.Rows.Add(t.NewRow().ItemArray = new object[] { 2, 1, "boss level 1 (employee count 2", 0 }); // must 100+110+20=230
            t.Rows.Add(t.NewRow().ItemArray = new object[] { 3, 2, "employee (bossId=2)", 100 });
            t.Rows.Add(t.NewRow().ItemArray = new object[] { 4, 2, "employee (bossId=2)", 110 });
            t.Rows.Add(t.NewRow().ItemArray = new object[] { 5, 2, "boss level 2 (bossId=2) (employee count 1)", 0 });// must 20
            t.Rows.Add(t.NewRow().ItemArray = new object[] { 6, 5, "employee (bossId=5)", 20 });
            t.Rows.Add(t.NewRow().ItemArray = new object[] { 7, 1, "boss level 1 (employee count 1", 0 }); // must 1200
            t.Rows.Add(t.NewRow().ItemArray = new object[] { 8, 7, "employee (bossId=5)", 1200 });
 
            return t;
        }
        static int GetSalary(int id, DataTable t)
        {
            int res = 0;
            DataRow[] dr_this = t.Select($"id={id}");
            if (dr_this.Length > 0)
                res += Convert.ToInt32(dr_this[0]["salary"]);
            else return res;
            DataRow[] dr_emp = t.Select($"pid={id}");
            foreach (DataRow dr in dr_emp)
            {
                res += GetSalary(Convert.ToInt32(dr["id"]), t);
            }
            return res;
        }
1
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
14.06.2018, 01:18
Цитата Сообщение от YaOnline Посмотреть сообщение
Сделал так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Salary
    {
        static Information information = new Information("database.db");
        List<ListWithName> InformationColumn = information.GenEntries("*");
        TreeNode tree = new TreeNode();
        public void CalculateSalary(int id, List<string> List)
        {
            tree.Row = InformationColumn[id - 1];
            List<string> List1 = new List<string>();
            foreach (TreeNode a in tree)
            {
                CalculateSalary(Convert.ToInt16(a.Row.SubItems[0]), List1);
                List.Add(a.Row.SubItems[4]);
            }
            List.Add(InformationColumn[id - 1].SubItems[4]);
            MessageBox.Show(InformationColumn[id - 1].SubItems[1].ToString());
            foreach (string b in List1)
            {
                MessageBox.Show(b);
            }
        }
    }
но он захватывает только 2 уровня
Ошибка в том, что на каждом уровне создается новый список (строка №9) и дальше передается внутрь (строка №12), а нужно все время внутрь рекурсии передавать изначальный список, который называется List.
Строка №13 лишняя - в списке будут дубликати, т.к. элемент будет добавляться на уровне рекурсии, где он является дочерним и на следующем, где он является родительским.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.06.2018, 01:18
Помогаю со студенческими работами здесь

Выбрать работников, у которых средняя зарплата за 2 года больше средней зарплаты всех работников
Ввести сведения о работниках предприятия (фамилию, год пос¬тупления на работу, среднюю зарплату за последние 2 года). Среди них выбрать...

Зарплата администрации школы: сделать расчет зарплаты и расчетный листок
парни помогите пожалуйста на счет задания: нужно в visual studio сделать &quot;зарплату администрации школы&quot;. т.е. сделать расчет зарплаты...

Почему зарплата менджера проекта в 2-3 раза меньше зарплаты разработчика ?
Я больше ближе к менеджерам :) И поэтому такая ситуация меня удивляет. Мне например кажется что своих нервов и здоровья на работах я...

Записи: Распечатать фамилии с указанием зарплаты тех рабочих, чья зарплата меньше прожиточного минимума
Дан массив из 100 записей. Записать содержит информацию о рабочих предприятия: фамилию, имя, год рождения, зарплату за предыдущий месяц....

Написать программу, которая выводит фамилии сотрудников в порядке убывания зарплаты (зарплата=оклад+премия)
На вход программе подаются сведения о сотрудниках некоторой организации. Сначала сообщается количество N сотрудников, затем вводятся N...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru