Загрузка данных


Задачи 4–8. Полные коды

---

Задача 4. Два времени с шагом 15 минут

Условие: два значения времени, первое раньше второго. Вывести время от начального до конечного с шагом 15 минут в формате ЧЧ:мм.

```1С
Время1 = Дата(1, 1, 1);
Время2 = Дата(1, 1, 1);
ВвестиДату(Время1, "Введите время начала", ЧастьДаты.Время);
ВвестиДату(Время2, "Введите время окончания", ЧастьДаты.Время);

Если Время1 > Время2 Тогда
    Сообщить("Ошибка: первое время должно быть раньше второго");
Иначе
    ТекВремя = Время1;
    Шаг = 15 * 60;   // 15 минут в секундах
    
    Пока ТекВремя <= Время2 Цикл
        Сообщить(Формат(ТекВремя, "ДФ=""ЧЧ:мм"""));
        ТекВремя = ТекВремя + Шаг;   // рекурсия
    КонецЦикла;
КонецЕсли;
```

Пример для 08:00 – 09:00:

```
08:00
08:15
08:30
08:45
09:00
```

---

Задача 5. Дни интервала с режимом работы

Условие: две даты (первая раньше). Вывести каждый день в формате дд/ММ/гггг режим работы с ЧЧ-00 по ЧЧ-00. Для субботы и воскресенья — с 08-00 по 16-00, для будней — с 08-00 по 18-00.

```1С
Дата1 = Дата(1, 1, 1);
Дата2 = Дата(1, 1, 1);
ВвестиДату(Дата1, "Введите первую дату", ЧастьДаты.Дата);
ВвестиДату(Дата2, "Введите вторую дату", ЧастьДаты.Дата);

Если Дата1 > Дата2 Тогда
    Сообщить("Ошибка: первая дата должна быть раньше второй");
Иначе
    ТекДата = НачалоДня(Дата1);
    КонецИнтервала = НачалоДня(Дата2);
    
    Пока ТекДата <= КонецИнтервала Цикл
        НомерДня = ДеньНедели(ТекДата);
        ДатаСтр = Формат(ТекДата, "ДФ=""дд/ММ/гггг""");
        
        Если НомерДня = 6 ИЛИ НомерДня = 7 Тогда
            Сообщить(ДатаСтр + " режим работы с 08-00 по 16-00");
        Иначе
            Сообщить(ДатаСтр + " режим работы с 08-00 по 18-00");
        КонецЕсли;
        
        ТекДата = ТекДата + 86400;   // +1 день
    КонецЦикла;
КонецЕсли;
```

Пример для 01.10.2012 – 08.10.2012:

```
01/10/2012 режим работы с 08-00 по 18-00
02/10/2012 режим работы с 08-00 по 18-00
03/10/2012 режим работы с 08-00 по 18-00
04/10/2012 режим работы с 08-00 по 18-00
05/10/2012 режим работы с 08-00 по 18-00
06/10/2012 режим работы с 08-00 по 16-00   ← суббота
07/10/2012 режим работы с 08-00 по 16-00   ← воскресенье
08/10/2012 режим работы с 08-00 по 18-00
```

---

Задача 6. Месяцы от первого числа до второго

Условие: ввести два целых числа от 1 до 12, первое должно быть меньше второго. Вывести названия месяцев от первого до второго.

```1С
М1 = 0; М2 = 0;
ВвестиЧисло(М1, "Введите первый месяц (1-12)", 2, 0);
ВвестиЧисло(М2, "Введите второй месяц (1-12)", 2, 0);

Если М1 < 1 ИЛИ М1 > 12 ИЛИ М2 < 1 ИЛИ М2 > 12 Тогда
    Сообщить("Ошибка: месяц должен быть от 1 до 12");
ИначеЕсли М1 >= М2 Тогда
    Сообщить("Ошибка: первый месяц должен быть меньше второго");
Иначе
    М = М1;
    Пока М <= М2 Цикл
        ДемоДата = Дата(2026, М, 1);
        Сообщить(Формат(ДемоДата, "ДФ=""ММММ"""));
        М = М + 1;
    КонецЦикла;
КонецЕсли;
```

Пример для 3 и 7:

```
март
апрель
май
июнь
июль
```

---

Задача 7. Уменьшение двух слов

Условие: ввести слово. Вывести ряд: первое слово уменьшается на 1 букву слева, второе — на 1 букву справа, пока не останется по одной букве.

Трактовка A: два слова рядом — левая часть от начала, правая от конца

```1С
Слово = "";
ВвестиСтроку(Слово, "Введите слово", 50);
Слово = СокрЛП(Слово);

Длина = СтрДлина(Слово);

// Первое слово уменьшается слева (растёт от 1 до середины)
// Второе уменьшается справа (уменьшается от длины до середины)
i = 1;

Пока i <= Длина - i + 1 Цикл
    Часть1 = Лев(Слово, i);                       // растёт: 1, 2, 3, …
    Часть2 = Прав(Слово, Длина - i + 1);          // уменьшается: вся, вся−1, …
    
    Сообщить(Часть1 + " " + Часть2);
    
    i = i + 1;
КонецЦикла;
```

Для слова Программирование (16 букв):

```
П Программирование
Пр Программировани
Про Программирован
...
```

Трактовка B: слово уменьшается с двух сторон, остаётся середина

```1С
Слово = "";
ВвестиСтроку(Слово, "Введите слово", 50);
Слово = СокрЛП(Слово);

Левый  = 1;
Правый = СтрДлина(Слово);

Пока Левый <= Правый Цикл
    Часть = Сред(Слово, Левый, Правый - Левый + 1);
    Сообщить(Часть);
    
    Левый  = Левый + 1;
    Правый = Правый - 1;
КонецЦикла;
```

Для слова Программирование:

```
Программирование
рограммировани
ограммирован
граммирова
раммиров
аммиро
ммир
ми
```

---

Задача 8. Уменьшение предложения по одному слову

Условие: ввести предложение. Вывести ряд, где каждый последующий элемент уменьшается на одно слово (убирается последнее слово).

```
Программировать очень интересно и занимательно
Программировать очень интересно и
Программировать очень интересно
Программировать очень
Программировать
```

```1С
Предложение = "";
ВвестиСтроку(Предложение, "Введите предложение", 200);
Предложение = СокрЛП(Предложение);

Пока НЕ ПустаяСтрока(Предложение) Цикл
    Сообщить(Предложение);
    
    // Находим последний пробел
    ПослПробел = 0;
    Для Сч = 1 По СтрДлина(Предложение) Цикл
        Если Сред(Предложение, Сч, 1) = " " Тогда
            ПослПробел = Сч;
        КонецЕсли;
    КонецЦикла;
    
    Если ПослПробел = 0 Тогда
        Прервать;   // больше нет слов
    Иначе
        Предложение = СокрЛП(Лев(Предложение, ПослПробел - 1));
    КонецЕсли;
КонецЦикла;
```

Как работает:

1. Выводим всё предложение
2. Находим последний пробел (перебором всего предложения)
3. Обрезаем всё после него — теряется последнее слово
4. Повторяем, пока строка не станет пустой

Обратите внимание: цикл Для внутри Пока — это нормально. Внешний Пока уменьшает предложение, внутренний Для ищет последний пробел.

---

Ключевые приёмы в задачах 4–8

Приём Где применяется
Пока … Цикл Все задачи
Рекурсия переменной X = X + шаг Задачи 4, 5
+ 86400 — +1 день Задача 5
+ 15 * 60 — +15 минут Задача 4
ДеньНедели(Дата) Задача 5
Формат(Дата, "ДФ=""…""") Задачи 4, 5, 6
Формат(Дата, "ДФ=""ММММ""") Задача 6
Работа со строками: Лев, Прав, Сред Задачи 7, 8
Поиск последнего пробела Задача 8
Прервать Задача 8

Важные числа

Число Смысл
86400 секунд в сутках (1 день)
15 * 60 = 900 15 минут в секундах
1 в ДеньНедели понедельник
6 суббота
7 воскресенье

Что важно понять

1. Внутри Пока обязательно менять переменную условия — иначе вечный цикл
2. Условие проверяется до тела — тело может не выполниться ни разу
3. Для дат +86400 = следующий день, +900 = +15 минут
4. ДеньНедели возвращает 1=Пн, …, 7=Вс
5. Задача 8 — классический пример вложенного цикла (Для внутри Пока)