Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
2 / 1 / 4
Регистрация: 21.04.2018
Сообщений: 204

Метод для работы с датой (вычисления трудоемкости разработки)

07.03.2020, 13:11. Показов 1814. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть класс программный продукт где есть поля:
1)Операционная система на которых работает продукт
2)Дата начала разработки (ДД.ММ.ГГГГ)
3)Дата окончания разработки (ДД.ММ.ГГГГ)
4)Количество сотрудников

И вот я не знаю как написать метод делает вычисления трудоемкости разработки продукта (человек / месяц). И как работать с датой
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class SoftwareProgram
    {
        private List<string> _opList = new List<string>();
        private DateTime date_start;
        private DateTime date_finish;
        private int countEmp;
 
 
 
        public SoftwareProgram(DateTime date_start, DateTime date_finish, int countEmp)
        {
 
            this.date_start = date_start;
            this.date_finish = date_finish;
            this.countEmp = countEmp;
 
 
        }
        public List<string> Operation
        {
            get
            { return _opList; }
        }
 
        public void AddOperation(string line)
        {
            Operation.Add(line);
        }
        public void CountOperations(List<string> list)
        {
            int k = 0;
 
            foreach (string i in list)
            {
                k = list.Count();
                Console.WriteLine(i);
                
 
            }
            Console.WriteLine("Count is ${0}", k);
 
 
        }
        public static void Main()
        {
            SoftwareProgram dtapi = new SoftwareProgram(new DateTime(2013, 1, 23), new DateTime(2014, 1, 23), 4);
 
            dtapi.AddOperation("Win");
            dtapi.AddOperation("Android");
            dtapi.AddOperation("MAC");
            dtapi.CountOperations(dtapi._opList);
 
 
 
 
        }
 
 
 
 
 
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.03.2020, 13:11
Ответы с готовыми решениями:

COCOMO Калькулятор для расчета трудоёмкости и сроков разработки программного продукта
Доброе время суток! Задали задание в университете, написать COCOMO калькулятор для расчета трудоёмкости и сроков разработки программного...

вычисления функции трудоемкости алгоритма
есть у меня некий алгоритм, в коментариях росписани к-чество операций for (int i = 0; i &lt; n-1; i++) // 1 операція, n-1 проходів...

функция яваскрипт для работы с датой!
Здраствуйте! У меня есть вот такая функция. Она делает так чтобы дата которую пользователь записывает в текстовое поле автоматически...

11
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
07.03.2020, 13:55
Цитата Сообщение от Yamis Посмотреть сообщение
метод делает вычисления трудоемкости разработки продукта (человек / месяц)
Не понимаю, какой должен быть результат? Например в вашем коде четыре сотрудника разрабатывают продукт ровно один год (12 месяцев). Вы хотите поделить 4/12 = 0.33 сотрудника работают в месяц (примерно одна рука первого сотрудника, и четверть головы второго) ?

Некоторые заметки по вашему коду:

Метод Main не должен иметь отношения к классу SoftwareProgram. Main - это точка входа в программу.
------------
В методе
C#
1
2
3
4
5
public List<string> Operation
{
    get
    { return _opList; }
}
нет смысла, так как он ничем не защищает приватный массив _opList от изменений. Поэтому этот метод можно удалить.
-----------
Метод
C#
1
2
3
4
5
6
7
8
9
10
public void CountOperations(List<string> list)
{
    int k = 0;
 
    foreach (string i in list)
    {
        k = list.Count();
        Console.WriteLine(i);
    }
    Console.WriteLine("Count is ${0}", k);
Нет смысла, передавать в метод массив в качестве параметра, так как экземпляр данного класса и так имеет доступ к приватному массиву _opList, о котором выводит информацию. Так же нет смысла в переменной k. Этот метод можно сократить до:
C#
1
2
3
4
5
6
7
8
public void CountOperations()
{
    foreach (string i in _opList)
    {
        Console.WriteLine(i);
    }
    Console.WriteLine("Count Operations is {0}", _opList.Count());
}
0
2 / 1 / 4
Регистрация: 21.04.2018
Сообщений: 204
07.03.2020, 15:23  [ТС]
samana,
Ну я не знаю, так в задание написано


Цитата Сообщение от samana Посмотреть сообщение
Не понимаю, какой должен быть результат? Например в вашем коде четыре сотрудника разрабатывают продукт ровно один год (12 месяцев). Вы хотите поделить 4/12 = 0.33 сотрудника работают в месяц (примерно одна рука первого сотрудника, и четверть головы второго) ?
Какое отношение вы имеете ввиду?

Цитата Сообщение от samana Посмотреть сообщение
Метод Main не должен иметь отношения к классу SoftwareProgram. Main - это точка входа в программу.
Ну я написал этот метод чтобы получить доступ к переменной, так как она приватная.

Цитата Сообщение от samana Посмотреть сообщение
В методе
C#Выделить код
1
2
3
4
5
public List<string> Operation
{
    get
    { return _opList; }
}
нет смысла, так как он ничем не защищает приватный массив _opList от изменений. Поэтому этот метод можно удалить.
Добавлено через 2 минуты
samana, Ну я писал этот класс для того чтобы потом сделать unit test для методов, ну и создал консольный проект чтобы смотреть правильно ли написан класс

Добавлено через 18 минут
samana, Я так понял что нужно подсчитать количество потраченого времени на изготовление продукта
Формула: Трудоемкости разработки = Время затраченное на производство продукции (час, чел-час) / ОП - объем произведенной продукции в натуральном выражении.
Tр = Время/ОП
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
07.03.2020, 16:19
Yamis, Похоже это всё связано с расчётами человеко-часов и т.п., но я в этом совершенно не разбираюсь..
Нашел на первом попавшемся сайте разные формулировки этого добра, но не хватило желания вникнуть.
0
2 / 1 / 4
Регистрация: 21.04.2018
Сообщений: 204
07.03.2020, 18:08  [ТС]
samana, Ок, а может вы знаете как мне с моей даты достать месяц?То есть как мне работать с датой?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
07.03.2020, 20:22
Цитата Сообщение от Yamis Посмотреть сообщение
может вы знаете как мне с моей даты достать месяц?То есть как мне работать с датой?
Свойство DateTime.Month
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,204
08.03.2020, 17:45
Yamis, по вашему коду есть несколько вопросов
1) в вашем случаи кол-во человек - это просто число. То бишь все равны? А если кто то взял переработку или наоборот работал меньше времени? Как минимум надо делать разные объекты людей и для каждого прописывать кол-во часов
2) Разработка продукта шла год. Ок. А сколько часов каждый из сотрудников работал. Ну допустим 8 часов ежедневно (хотя в коде этого нет). Как быть с праздниками, больничными, отпусками, 2-ой оплатой (как правило для удобства подсчета увеличивается кол-во часов в 2 раза, то бишь по России этот день считается как будто 16 часов) ? В каждой кампании может быть расчет по разному идти. Сам считаю ЗП сотрудникам, потому и знаю эти тонкости.
Хотите сделать правильно задачу - реализовывайте с помощью БД (SQL, MySql и им подобные). Сделать это только с использованием C# - реально, но данная задача очень трудно будет поддаваться модификациям, придется использовать множество костылей. Если интересно - могу набросать примерный код.
В идеале это делается так:
1 марта:
сотрудник_1 - 8 часов
сотрудник_2 - 8 часов
сотрудник_3 - 8 часов
2 марта:
сотрудник_1 - 8 часов
сотрудник_3 - 8 часов
В итоге при правильной организованной БД подсчеты делаются очень просто.
Цитата Сообщение от samana Посмотреть сообщение
Не понимаю, какой должен быть результат? Например в вашем коде четыре сотрудника разрабатывают продукт ровно один год (12 месяцев). Вы хотите поделить 4/12 = 0.33 сотрудника работают в месяц (примерно одна рука первого сотрудника, и четверть головы второго) ?
На самом деле все проще. Берем любой месяц, например март - 31 день. По логике ТС они работают круглосуточно (рабство похуже римских средневековых времен). 31 день * 24 часа вот весь итог за март, и это итог для каждого сотрудника.
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
08.03.2020, 18:01
Цитата Сообщение от Enifan Посмотреть сообщение
На самом деле все проще. Берем любой месяц, например март - 31 день. По логике ТС они работают круглосуточно (рабство похуже римских средневековых времен). 31 день * 24 часа вот весь итог за март, и это итог для каждого сотрудника.
Возможно всё именно так, как вы пишите, тем более если вы сами крутитесь в этой теме.. Просто мне непонятна сама суть фразы:
Цитата Сообщение от Yamis Посмотреть сообщение
вычисления трудоемкости разработки продукта (человек / месяц)
и вот допустим мы получили ответ 31*24=744, что дают эти цифры? Сильно ли трудоёмко шла разработка, или может целыми днями сидели и пили кофе? И причём здесь тогда трудоёмкость, если по факту идёт простой подсчёт кол-ва рабочих часов.. Это не вопрос к вам, просто рассуждения.
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,204
08.03.2020, 18:41
Цитата Сообщение от samana Посмотреть сообщение
вы сами крутитесь в этой теме
я не полноценно кручусь в этой теме, это лишь одна из немногих обязанностей специфики моей работы. Я веду сдельный расчет, но эти тонкости знаю, так как общаюсь много с кем, и приходится изучать много информации и законы, которые в некоторых случаях очень хорошо выручали.
Цитата Сообщение от samana Посмотреть сообщение
мы получили ответ 31*24=744, что дают эти цифры?
Если брать организацию, которая ведет учет ЗП полностью официально (заводы, гос-предприятия), то расчет ЗП идет такой:
возьмем к примеру март 2020 года. В нем 31 день, официальных рабочих дней - 22 (ПН, ВТ, СР, ЧТ, ПТ). Если брать человека у которого оклад например 50000 рублей, то в этом месяце 1 час работы для него стоит 50000 / (22 * 8), что равно 284,09 рубля. Если в этом месяце он отработал 744 часа, то его ЗП составляет 284.09 * 744 = 211965,6 рублей. Но как я упомянул выше, такого рабства не существует, то как итог - алгоритм программы составлен неверно.
Теперь возьмем тот же расчет, но допустим человек вышел на работу в праздничный день (8 марта), а это автоматически идет двойная оплата, или если на математическом уровне +16 часов, вместо 8-ми. В таком случаи он отработал 22 * 8 + 16 часов, что в итоге получится 192 * 284.09 = 54545.28. Вот это правильный алгоритм с учетом 2-ой оплаты.
И это я еще не беру расчет с учетом премиальных (хотя он по сути почти такой же)
Цитата Сообщение от samana Посмотреть сообщение
Сильно ли трудоёмко шла разработка, или может целыми днями сидели и пили кофе?
Вопрос хороший, но тут зависит от того, какая оплата у сотрудника. Как правило существует 2 вида:
1) по трудовому кодексу (главное часы, остальное не важно)
2) сдельная - сделал дело хотя за 2 часа, хотя за 2 дня - получишь n-сумму.
Если брать 1-ый пункт, то можно и целыми днями пить кофе, тебе главное часы "отсидеть"
Цитата Сообщение от samana Посмотреть сообщение
И причём здесь тогда трудоёмкость
возможно ТС написал, не подумав что означает данный термин
1
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
08.03.2020, 19:27
Enifan, Спасибо что не поленились написать такой подробный ответ. В целом всё оказалось ожидаемо привычно - либо часовая оплата, либо сдельная. А вот уточнение от ТС
Цитата Сообщение от Yamis Посмотреть сообщение
(человек / месяц)
просто сбило изначально с толку, вот и не мог понять, что требовалось в задании.
0
2 / 1 / 4
Регистрация: 21.04.2018
Сообщений: 204
09.03.2020, 12:35  [ТС]
Enifan, Очень много текста, вы наверно просто приняли очень серьёзно это задание, хотя это простое задание где нужно просто один клас написать и потом unit test написать к методам
Кстати я немного дописал
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
 public class SoftwareProgram
    {
        private List<string> _opList = new List<string>();
        private DateTime date_start;
        private DateTime date_finish;
        private int countEmp;
 
 
 
        public SoftwareProgram(DateTime date_start, DateTime date_finish, int countEmp)
        {
 
            this.date_start = date_start;
            this.date_finish = date_finish;
            this.countEmp = countEmp;
 
 
        }
       
 
        public void AddOperation(string line)
        {
            _opList.Add(line);
        }
        public void CountOperations()
        {
            
 
            foreach (string i in _opList)
            {
               
                Console.WriteLine(i);
                
 
            }
            Console.WriteLine("Count is ${0}", _opList.Count());
 
 
        }
 
        public void PersonMonth(DateTime date_start, DateTime date_finish,int countEMP)
        {
 
 
            DateTime startdate = date_start;
 
            DateTime endDate = date_finish;
            double timespan;
            int result = DateTime.Compare(startdate, endDate);
            if (result > 0)
            {
                throw new Exception(" is later than ");
            }
            else if (result == 0)
            {
                throw new Exception(" is the same time as ");
 
            }
            else
            {
 
                timespan = endDate.Subtract(startdate).Days / (365.25 / 12);
 
                Console.WriteLine("Date Difference (month): " + Math.Round(timespan, MidpointRounding.ToEven));
            }
            if (countEMP <= 0)
            {
                throw new FormatException("Number of emp is less or equals 0");
            }
            else
            {
                double td = timespan / countEMP;
                Console.WriteLine("Month/CountEmp: " + Math.Round(td, MidpointRounding.ToEven));
            }
 
 
        }
 
 
 
 
 
 
 
 
        public static void Main()
        {
            SoftwareProgram dtapi = new SoftwareProgram(new DateTime(2014, 2, 23), new DateTime(2013, 2, 23), 2);
 
            dtapi.AddOperation("Win");
            dtapi.AddOperation("Android");
            dtapi.AddOperation("MAC");
            dtapi.CountOperations();
            try
            {
                dtapi.PersonMonth(dtapi.date_start, dtapi.date_finish, dtapi.countEmp);
            }
            catch (FormatException exe)
            {
 
                Console.WriteLine("Error: " + exe.Message); ;
            }
            catch (Exception ex) {
                Console.WriteLine("Error: " + dtapi.date_start.ToString("yyyy/MM/dd") + ex.Message + dtapi.date_finish.ToString("yyyy/MM/dd")); 
            }
           
          
        }
 
    }

А это unit test
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace SoftwareTest
{
    [TestClass]
    public class SoftwareTest
    {
        [TestMethod]
        [ExpectedException(typeof(Exception))]
        public void TestMethod1()
          
        {
            DateTime dateStart = new DateTime(2009, 8, 1);
            DateTime dateEnd = new DateTime(2008, 8, 1);
            int countEMP = 4;
            SoftwareProgram dtapi = new SoftwareProgram(dateStart,dateEnd,countEMP);
            dtapi.PersonMonth(dateStart, dateEnd, countEMP);
            
 
 
 
        }
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,036
Записей в блоге: 2
09.03.2020, 13:13
Лучший ответ Сообщение было отмечено Yamis как решение

Решение

Цитата Сообщение от Yamis Посмотреть сообщение
нужно просто один клас написать
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    public class SoftwareProgram
    {
        private List<string> opList = new List<string>();
        private IReadOnlyCollection<string> _opList;
        public IReadOnlyCollection<string> OpList => _opList ?? (_opList = opList.AsReadOnly());
        public DateTime DateStart { get; private set; }
        public DateTime DateFinish { get; private set; }
        public int CountEmp { get; private set; }
 
 
 
        public SoftwareProgram(DateTime dateStart, DateTime dateFinish, int countEmp)
        {
            DateStart = dateStart;
            DateFinish = dateFinish;
            CountEmp = countEmp;
        }
 
 
        public void AddOperation(string line) => opList.Add(line);
 
        public void ConsoleWriteOperations()
        {
            Console.WriteLine(string.Join(Environment.NewLine, OpList));
            Console.WriteLine($"Count is ${OpList.Count}");
        }
 
        public static void ConsoleWritePersonDays(DateTime dateStart, DateTime dateFinish, int countEMP)
        {
 
            TimeSpan interval = dateFinish - dateStart;
            double days = interval.TotalDays;
            if (days < 0)
                throw new Exception(" is later than ");
 
            if (days == 0)
                throw new Exception(" is the same time as ");
            if (countEMP <= 0)
                throw new FormatException("Number of emp is less or equals 0");
 
            Console.WriteLine($"Date Difference (days): {days:0}");
            Console.WriteLine($"Month/CountEmp: {days / countEMP:0}");
        }
        public void ConsoleWritePersonDays() => ConsoleWritePersonDays(DateStart, DateFinish, CountEmp);
 
        public static void ConsoleWritePersonMounts(DateTime dateStart, DateTime dateFinish, int countEMP)
        {
 
            TimeSpan interval = dateFinish - dateStart;
            double mounts = interval.TotalDays*12/365.25;
            if (mounts < 0)
                throw new Exception(" is later than ");
 
            if (mounts == 0)
                throw new Exception(" is the same time as ");
            if (countEMP <= 0)
                throw new FormatException("Number of emp is less or equals 0");
 
            Console.WriteLine($"Date Difference (mounts): {mounts:0}");
            Console.WriteLine($"Month/CountEmp: {mounts / countEMP:0}");
        }
        public void ConsoleWritePersonMounts() => ConsoleWritePersonMounts(DateStart, DateFinish, CountEmp);
 
    }
Честно говоря, немного сомнений возникает в правильности понимания задачи.
Обычно подобное используется для сетевого графика.
Указывается начало и конец периода и количество занятых рабочих.
Трудозатраты, в таком случае, это произведение периода на количество занятых рабочих.

Или бывает обратная задача. Заданы трудозатраты и количество рабочих определяется как частное от деления трудозатрат на период.

С такой постановкой как у вас, где трудозатраты это частное от деления периода на количество работников - сталкиваюсь первый раз.

P.S. На всякий случай сделал два метода для вывода трудозатрат в днях и в месяцах.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2020, 13:13
Помогаю со студенческими работами здесь

Построить класс для работы с датой
Добрый день товарищи, очень нужна помощь, буду благодарен каждому ответу. Задание: Постpоить класс для работы с датой. Класс должен...

Создать класс для работы с датой
Доброго времени суток всем! В программировании я не силён,поэтому у меня возникла данная проблема В университете задали задание : ...

Создание класса для работы с датой
Задание 10. Самостоятельно изучите тип данных DateTime, на основе которого необходимо создать класс для работы с датой. Данный класс...

Программа органайзер для работы с датой
В программу можно вносить данные людях: фамилия, имя, отчество, дата рождения (из календаря); на выбранную дату календаря программа выводит...

Получить аналитическую оценку трудоемкости работы алгоритма сортировки
есть код программы и нужно вычислить трудоемкость алгоритма, а то какая-то шляпа получилась. program Project1; const StSizeMax =...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru