Имя: Пароль:
1C
1С v8
Разделить период на порции
0 Franchiser
 
гуру
03.04.19
23:49
Как разделить период примерно на равные порции.
Например , период 01.02.19 по 28.02.19.
Вариант 1
Средний размер порции ОКР(28/10 ,0) =3
Получаем периоды:
01.02-03.02 (3 дня)
04.02-06.02 (3 дня)
...
28.02-28.02 (1 день)

Вариант 2
Цел(28/10) = 2
Получаем периоды:
01.02-02.02 (2 дня)
03.02-04.02 (2 дня)
...
19.02-28.02 (11 дней)

Далее берём 55 дней
Вариант 1.
Получим деление  на периоды:
По 6 дней,
Последний период 1 день
1 МихаилМ
 
04.04.19
01:57
нод
2 Chameleon1980
 
04.04.19
05:03
32
3 Web00001
 
04.04.19
06:00
(0)Продолжайте наблюдение
4 Жан Пердежон
 
04.04.19
06:37
(0) да
5 Bigbro
 
04.04.19
07:14
ну если 6 и 1, а также 11 и 2 можно считать "примерно равными", то норм.
но вообще задача для 8 класса средней школы, или в каком там сейчас начинают информатику преподавать?
6 Franchiser
 
гуру
04.04.19
09:24
Ладно вы ничего не поняли.
Вариант 1 я не могу всегда применять, хотя он даёт лучшие результаты на месяце.
Например, если дней 25, то
Получается размер порции с округлением 3.
Но получается перебор.
Мне нужно получить ровно 10 порций а тут получается только 9.
7 Жан Пердежон
 
04.04.19
09:27
(6) намекаю, в (0) ты ничего не спрашивал
8 Bigbro
 
04.04.19
09:28
(6) так как тебя понять если ты вместо внятного формулирования задачи пишешь какую то пургу с вариантами решения непонятно чего, а потом спрашиваешь как лучше? невозможно на это ответить если не знать в чем вопрос.
и судя по приведенным примерам ты тоже исходную задачу не понимаешь
9 Franchiser
 
гуру
04.04.19
09:31
Мне нужно разбить укащанный период (месяц, квартал и ТД) на форме на 10 равных порций для многопоточной загрузки.
Иногда хороший результат выдает вариант 1, иногда вариант 2. При количестве дней 15, 25, 35 и тд вариант 1 не вернёт 10 порций
10 Bigbro
 
04.04.19
09:33
(9) даю подсказку - округление суммы не равно сумме округлений. иногда сильно не равно.
11 Жан Пердежон
 
04.04.19
09:34
Вот тебе недоответ на твой недовопрос:

Размер = 28;
Порций = 10;
Р1  = Цел(Размер/Порций) = 2;
КР2 = Ост(Размер;Порций) = 8;

Итого:
КР2 отрезков размера Р1+1
(Порций-КР2) отрезков размера Р1
12 Franchiser
 
гуру
04.04.19
09:36
Первое значение массива всегда начало периода, последнее значение - конец периода, мне нужно рассчитать  8 промежуточных значений.
13 Zmich
 
04.04.19
09:38
Можно высчитывать среднее (округленное или целая часть) на каждом этапе. Тогда длина периодов будет примерно одинакова. Например, для случая 55 дней:
1). Окр(55/10) = 6
2). Окр((55-6)/9) = Окр(49/9) = 5
3). Окр((49-5)/8) = Окр(44/8) = 6
и т.д.
14 Franchiser
 
гуру
04.04.19
09:39
Вот такой результат нужен:
Расчет: февраль/март
1
4
7
10
13
16
19
22
25
28
28/31
15 Franchiser
 
гуру
04.04.19
09:42
(13) отлично, нужно попробовать)
16 Bigbro
 
04.04.19
10:19
(13) ну вот, лишил человека возможности подумать. подсказка уже была ..
17 Bigbro
 
04.04.19
10:21
(14) у тебя 9 периодов, а ты говорил надо 10.
или в феврале в твоей вселенной 31 день?
18 Franchiser
 
гуру
04.04.19
10:37
(17)
1. 1-4
2. 4-7
3. 7-10
4. 10-13
5. 13-16
6. 16-19
7. 19-22
8. 22-25
9  25-28
10. 28-28
19 Franchiser
 
гуру
04.04.19
10:37
Если март
То
10. 28-31
20 Bigbro
 
04.04.19
10:42
любопытный период длиной сколько? ноль дней?
во сколько раз ноль отличается от остальных периодов длиной 3 дня?
21 Bigbro
 
04.04.19
10:44
и какое количество событий может произойти за период длиной в ноль? )
и зачем нужен такой период, если он фактически - пустой?
почему бы не добавить еще 10 или тысячу или любое другое число таких же нулевых периодов к разбиению - что это изменит?
22 Franchiser
 
гуру
04.04.19
11:19
(21) правая граница не включается.
10. 28.02.19 00:00:00 - 28.02.19 23:59:59
23 Franchiser
 
гуру
04.04.19
11:49
Получилось:
    // Вставить содержимое обработчика.
КоличествоПотоков = 10;    
    
ОбщееКоличество = (НачалоДня(Период.ДатаОкончания)-НачалоДня(Период.ДатаНачала))/86400+1;
Сообщить("Всего дней "+ОбщееКоличество);

ОстатокДней = ОбщееКоличество;
ОстатокПорций = КоличествоПотоков;
ГраницаПредыдущейПорции = Период.ДатаНачала;
ОбработаноДней = 0;

Для Сч=1 по КоличествоПотоков Цикл
    
    РазмерПорции = Окр(ОстатокДней/ОстатокПорций,0);    
    
    НижняяГраница = ГраницаПредыдущейПорции;
    ВерхняяГраница =  НижняяГраница + РазмерПорции*86400;

    Если Сч=1 Тогда
        Сообщить("_ По " +ВерхняяГраница +" " +РазмерПорции);
    ИначеЕсли Сч=КоличествоПотоков Тогда    
        Сообщить("_С " + НижняяГраница  +" " +РазмерПорции);
    Иначе
        Сообщить("С " + НижняяГраница + " По " +ВерхняяГраница +" " +РазмерПорции);
    КонецЕсли;
    
    ОстатокДней = ОстатокДней - РазмерПорции;
    ОстатокПорций = ОстатокПорций - 1;
    ГраницаПредыдущейПорции = ВерхняяГраница;
    ОбработаноДней = ОбработаноДней + РазмерПорции;    
КонецЦикла;    

Сообщить("Обработано дней "+ОбработаноДней);
24 Mikeware
 
04.04.19
11:51
чот сразу вспомнился товарищ Брезенхем...
25 Bigbro
 
04.04.19
12:16
а теперь попробуй для КоличествоПотоков = 11
26 Franchiser
 
гуру
04.04.19
12:29
(25) Нормально работает для 11
27 Franchiser
 
гуру
04.04.19
12:29
Период в обработке кратный месяцу