1С Массивы/циклы программа расчета протеина
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Здравствуйте!
Я подготовил для вас программу на языке 1С, которая выполняет указанные требования. Ниже представлен код с подробными комментариями для каждого блока.
```1C
// Объявляем переменные для хранения вводимых пользователем данных
Перем ЧастотаПриема;
Перем ПротеинВБудни;
Перем ПротеинВВыходные;
Перем КоличествоДней;
// Запрашиваем у пользователя необходимые данные
ЧастотаПриема = ВвестиЧисло("Введите частоту приема (число дней между приемами):");
ПротеинВБудни = ВвестиЧисло("Введите количество протеина в будние дни (грамм):");
ПротеинВВыходные = ВвестиЧисло("Введите количество протеина в выходные дни (грамм):");
КоличествоДней = ВвестиЧисло("Введите общее количество дней приема:");
// Создаем таблицу значений для хранения информации по каждому дню
ТаблицаПриема = Новый ТаблицаЗначений;
ТаблицаПриема.Колонки.Добавить("НомерДня");
ТаблицаПриема.Колонки.Добавить("ДеньНедели");
ТаблицаПриема.Колонки.Добавить("ДеньПриема");
ТаблицаПриема.Колонки.Добавить("Протеин");
ТаблицаПриема.Колонки.Добавить("НомерНедели");
// Начинаем цикл по всем дням
Для НомерДня = 1 По КоличествоДней Цикл
// Вычисляем день недели (0 - понедельник, 1 - вторник, ..., 6 - воскресенье)
ДеньНедели = Остаток(НомерДня - 1, 7);
// Вычисляем номер недели
НомерНедели = Цел( (НомерДня - 1) / 7 ) + 1;
// Определяем, является ли текущий день днем приема
Если Остаток(НомерДня - 1, ЧастотаПриема) = ЧастотаПриема - 1 Тогда
ДеньПриема = Истина;
// Определяем количество протеина в зависимости от дня недели
Если ДеньНедели >= 0 И ДеньНедели <= 4 Тогда // 0-4: понедельник - пятница
Протеин = ПротеинВБудни;
Иначе // 5-6: суббота - воскресенье
Протеин = ПротеинВВыходные;
КонецЕсли;
Иначе
ДеньПриема = Ложь;
Протеин = 0;
КонецЕсли;
// Добавляем информацию о дне в таблицу
Строка = ТаблицаПриема.Добавить();
Строка.НомерДня = НомерДня;
Строка.ДеньНедели = ДеньНедели;
Строка.ДеньПриема = ДеньПриема;
Строка.Протеин = Протеин;
Строка.НомерНедели = НомерНедели;
КонецЦикла;
// Создаем соответствие для хранения суммы протеина по неделям
СписокНедель = Новый Соответствие();
// Цикл по строкам таблицы для суммирования протеина по неделям
Для Каждого Строка Из ТаблицаПриема Цикл
НомерНедели = Строка.НомерНедели;
Протеин = Строка.Протеин;
Если СписокНедель.СодержитКлюч(НомерНедели) Тогда
СписокНедель[НомерНедели] = СписокНедель[НомерНедели] + Протеин;
Иначе
СписокНедель.Вставить(НомерНедели, Протеин);
КонецЕсли;
КонецЦикла;
// Выводим результаты
ОбщийПротеин = 0;
Сообщить("Количество необходимого протеина понедельно:");
Для Каждого Пара Из СписокНедель Цикл
НомерНедели = Пара.Ключ;
ПротеинВНеделю = Пара.Значение;
ОбщийПротеин = ОбщийПротеин + ПротеинВНеделю;
Сообщить("Неделя " + НомерНедели + " – " + ПротеинВНеделю + " гр");
КонецЦикла;
Сообщить("");
Сообщить("Всего потребуется протеина: " + ОбщийПротеин + " гр");
```
**Объяснение кода:**
1. **Ввод данных от пользователя:**
- Запрашиваем у пользователя частоту приема, количество протеина в будние и выходные дни, общее количество дней приема.
2. **Инициализация таблицы значений:**
- Создаем таблицу `ТаблицаПриема` для хранения информации по каждому дню.
- Добавляем необходимые колонки: номер дня, день недели, является ли день днем приема, количество протеина, номер недели.
3. **Основной цикл по дням:**
- Для каждого дня вычисляем:
- **День недели:** с помощью `Остаток(НомерДня - 1, 7)` мы получаем число от 0 до 6, соответствующее дням недели от понедельника до воскресенья.
- **Номер недели:** делением на 7 получаем текущую неделю.
- **Является ли день днем приема:** проверяем, делится ли (НомерДня - 1) на частоту приема с остатком, равным (ЧастотаПриема - 1). Это учитывает первый прием на третий день при ЧастотаПриема = 3.
- **Количество протеина:** если день является днем приема, назначаем количество протеина в зависимости от того, будний это день или выходной.
- Добавляем информацию о текущем дне в `ТаблицаПриема`.
4. **Суммирование протеина по неделям:**
- Создаем соответствие `СписокНедель`, где ключ — номер недели, значение — суммарное количество протеина за эту неделю.
- Проходим по всем строкам `ТаблицаПриема` и накапливаем протеин по неделям.
5. **Вывод результатов:**
- Выводим количество протеина, необходимое за каждую неделю.
- Выводим общее количество протеина за весь период.
**Примечание:** В формуле определения дня приема `Если Остаток(НомерДня - 1, ЧастотаПриема) = ЧастотаПриема - 1 Тогда` мы смещаем начало отсчета так, чтобы первый прием происходил на `ЧастотаПриема`-й день (как в вашем примере).
**Пример работы программы:**
Допустим, пользователь ввел следующие данные:
- Частота приема: 3
- Количество протеина в будние: 50
- Количество протеина в выходные: 70
- Количество дней приема: 10
**Результат программы будет:**
```
Количество необходимого протеина понедельно:
Неделя 1 – 120 гр
Неделя 2 – 170 гр
Всего потребуется протеина: 290 гр
```
Это означает, что в первую неделю потребуется 120 грамм протеина, во вторую — 170 грамм, всего — 290 грам
Я подготовил для вас программу на языке 1С, которая выполняет указанные требования. Ниже представлен код с подробными комментариями для каждого блока.
```1C
// Объявляем переменные для хранения вводимых пользователем данных
Перем ЧастотаПриема;
Перем ПротеинВБудни;
Перем ПротеинВВыходные;
Перем КоличествоДней;
// Запрашиваем у пользователя необходимые данные
ЧастотаПриема = ВвестиЧисло("Введите частоту приема (число дней между приемами):");
ПротеинВБудни = ВвестиЧисло("Введите количество протеина в будние дни (грамм):");
ПротеинВВыходные = ВвестиЧисло("Введите количество протеина в выходные дни (грамм):");
КоличествоДней = ВвестиЧисло("Введите общее количество дней приема:");
// Создаем таблицу значений для хранения информации по каждому дню
ТаблицаПриема = Новый ТаблицаЗначений;
ТаблицаПриема.Колонки.Добавить("НомерДня");
ТаблицаПриема.Колонки.Добавить("ДеньНедели");
ТаблицаПриема.Колонки.Добавить("ДеньПриема");
ТаблицаПриема.Колонки.Добавить("Протеин");
ТаблицаПриема.Колонки.Добавить("НомерНедели");
// Начинаем цикл по всем дням
Для НомерДня = 1 По КоличествоДней Цикл
// Вычисляем день недели (0 - понедельник, 1 - вторник, ..., 6 - воскресенье)
ДеньНедели = Остаток(НомерДня - 1, 7);
// Вычисляем номер недели
НомерНедели = Цел( (НомерДня - 1) / 7 ) + 1;
// Определяем, является ли текущий день днем приема
Если Остаток(НомерДня - 1, ЧастотаПриема) = ЧастотаПриема - 1 Тогда
ДеньПриема = Истина;
// Определяем количество протеина в зависимости от дня недели
Если ДеньНедели >= 0 И ДеньНедели <= 4 Тогда // 0-4: понедельник - пятница
Протеин = ПротеинВБудни;
Иначе // 5-6: суббота - воскресенье
Протеин = ПротеинВВыходные;
КонецЕсли;
Иначе
ДеньПриема = Ложь;
Протеин = 0;
КонецЕсли;
// Добавляем информацию о дне в таблицу
Строка = ТаблицаПриема.Добавить();
Строка.НомерДня = НомерДня;
Строка.ДеньНедели = ДеньНедели;
Строка.ДеньПриема = ДеньПриема;
Строка.Протеин = Протеин;
Строка.НомерНедели = НомерНедели;
КонецЦикла;
// Создаем соответствие для хранения суммы протеина по неделям
СписокНедель = Новый Соответствие();
// Цикл по строкам таблицы для суммирования протеина по неделям
Для Каждого Строка Из ТаблицаПриема Цикл
НомерНедели = Строка.НомерНедели;
Протеин = Строка.Протеин;
Если СписокНедель.СодержитКлюч(НомерНедели) Тогда
СписокНедель[НомерНедели] = СписокНедель[НомерНедели] + Протеин;
Иначе
СписокНедель.Вставить(НомерНедели, Протеин);
КонецЕсли;
КонецЦикла;
// Выводим результаты
ОбщийПротеин = 0;
Сообщить("Количество необходимого протеина понедельно:");
Для Каждого Пара Из СписокНедель Цикл
НомерНедели = Пара.Ключ;
ПротеинВНеделю = Пара.Значение;
ОбщийПротеин = ОбщийПротеин + ПротеинВНеделю;
Сообщить("Неделя " + НомерНедели + " – " + ПротеинВНеделю + " гр");
КонецЦикла;
Сообщить("");
Сообщить("Всего потребуется протеина: " + ОбщийПротеин + " гр");
```
**Объяснение кода:**
1. **Ввод данных от пользователя:**
- Запрашиваем у пользователя частоту приема, количество протеина в будние и выходные дни, общее количество дней приема.
2. **Инициализация таблицы значений:**
- Создаем таблицу `ТаблицаПриема` для хранения информации по каждому дню.
- Добавляем необходимые колонки: номер дня, день недели, является ли день днем приема, количество протеина, номер недели.
3. **Основной цикл по дням:**
- Для каждого дня вычисляем:
- **День недели:** с помощью `Остаток(НомерДня - 1, 7)` мы получаем число от 0 до 6, соответствующее дням недели от понедельника до воскресенья.
- **Номер недели:** делением на 7 получаем текущую неделю.
- **Является ли день днем приема:** проверяем, делится ли (НомерДня - 1) на частоту приема с остатком, равным (ЧастотаПриема - 1). Это учитывает первый прием на третий день при ЧастотаПриема = 3.
- **Количество протеина:** если день является днем приема, назначаем количество протеина в зависимости от того, будний это день или выходной.
- Добавляем информацию о текущем дне в `ТаблицаПриема`.
4. **Суммирование протеина по неделям:**
- Создаем соответствие `СписокНедель`, где ключ — номер недели, значение — суммарное количество протеина за эту неделю.
- Проходим по всем строкам `ТаблицаПриема` и накапливаем протеин по неделям.
5. **Вывод результатов:**
- Выводим количество протеина, необходимое за каждую неделю.
- Выводим общее количество протеина за весь период.
**Примечание:** В формуле определения дня приема `Если Остаток(НомерДня - 1, ЧастотаПриема) = ЧастотаПриема - 1 Тогда` мы смещаем начало отсчета так, чтобы первый прием происходил на `ЧастотаПриема`-й день (как в вашем примере).
**Пример работы программы:**
Допустим, пользователь ввел следующие данные:
- Частота приема: 3
- Количество протеина в будние: 50
- Количество протеина в выходные: 70
- Количество дней приема: 10
**Результат программы будет:**
```
Количество необходимого протеина понедельно:
Неделя 1 – 120 гр
Неделя 2 – 170 гр
Всего потребуется протеина: 290 гр
```
Это означает, что в первую неделю потребуется 120 грамм протеина, во вторую — 170 грамм, всего — 290 грам
(5) Забавное допущение. Ввод даты начала приема оно не осилило. Вместо банальной свертки таблицы или даже суммирования одновременно с заполнением таблицы запулило второй цикл...
В топку.
Не, ты-то конечно радуйся, что уж.
Правда, круто?
Для НомерДня = 1 По КоличествоДней Цикл
В топку.
Не, ты-то конечно радуйся, что уж.
(5) У меня такой код уже был, но запустить не получилось, не понимаю в чем проблема пишет:
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(16,23)}: Тип не определен (ТаблицаЗначений)
ТаблицаПриема = Новый <<?>>ТаблицаЗначений; (Проверка: Тонкий клиент)
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(16,23)}: Тип не определен (ТаблицаЗначений)
ТаблицаПриема = Новый <<?>>ТаблицаЗначений; (Проверка: Тонкий клиент)
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(2,2)}: Неизвестная аннотация (НаСеревере)
&<<?>>НаСеревере (Проверка: Сервер)
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(2,2)}: Неизвестная аннотация (НаСеревере)
&<<?>>НаСеревере (Проверка: Сервер)
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(2,2)}: Неизвестная аннотация (НаСеревере)
&<<?>>НаСеревере (Проверка: Тонкий клиент)
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(2,2)}: Неизвестная аннотация (НаСеревере)
&<<?>>НаСеревере (Проверка: Тонкий клиент)
(7)
&<<?>>НаСеревере (Проверка: Сервер)
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(2,2)}: Неизвестная аннотация (НаСеревере)
&<<?>>НаСеревере (Проверка: Сервер)
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(2,2)}: Неизвестная аннотация (НаСеревере)
&<<?>>НаСеревере (Проверка: Тонкий клиент)
{ВнешняяОбработка.ДомашнееЗадание2День2.Форма.Форма.Форма(2,2)}: Неизвестная аннотация (НаСеревере)
&<<?>>НаСеревере (Проверка: Тонкий клиент)
(7)
(14) Ух ты! И правда спрятал. Ну ничего у нас все ходы записаны
Здравствуйте, помогите пожалуйста написать программу в 1С, которая должна рассчитать, какое количество протеина необходимое на весь период (ВсегоДней). Показать количество принятого протеина за каждую неделю.1. Расчёт всегда начинается с понедельника (первый день понедельник).2. Пользователь вводит частоту приема протеина (значение хранить в переменной ЧастотаПриема):Пример:ЧастотаПриема = 31 день, понедельник — нет,2 день, вторник — нет,3 день, среда — да,4 день, четверг — нет,5 день, пятница — нет,6 день, суббота — да,7 день, воскресенье — нет,8 день, понедельник — нет,9 день, вторник — даи так далее.3. Количество принятого протеина в будние и выходные разное. Запросить эти данные у пользователя, хранить в переменных ПротеинВБудни и ПротеинВВыходные.4. Количество дней приема запросить у пользователя (количество дней не ограниченно).Программа должна:1. Хранить всю информацию по приему в массиве (с первого по последний день)2. Сообщить количество необходимого протеина понедельно(Неделя 1 – 500грНеделя 2 – 700грНеделя 3 – 600гр)3. Сообщить сколько всего потребуется протеина. (Всего – 1800гр)Данные от пользователя:1. Частота приема – Число;2. Количество протеина в будние – число;3. Количество протеина в выходные – число;4. Количество дней приема – Число
Здравствуйте, помогите пожалуйста написать программу в 1С, которая должна рассчитать, какое количество протеина необходимое на весь период (ВсегоДней). Показать количество принятого протеина за каждую неделю.1. Расчёт всегда начинается с понедельника (первый день понедельник).2. Пользователь вводит частоту приема протеина (значение хранить в переменной ЧастотаПриема):Пример:ЧастотаПриема = 31 день, понедельник — нет,2 день, вторник — нет,3 день, среда — да,4 день, четверг — нет,5 день, пятница — нет,6 день, суббота — да,7 день, воскресенье — нет,8 день, понедельник — нет,9 день, вторник — даи так далее.3. Количество принятого протеина в будние и выходные разное. Запросить эти данные у пользователя, хранить в переменных ПротеинВБудни и ПротеинВВыходные.4. Количество дней приема запросить у пользователя (количество дней не ограниченно).Программа должна:1. Хранить всю информацию по приему в массиве (с первого по последний день)2. Сообщить количество необходимого протеина понедельно(Неделя 1 – 500грНеделя 2 – 700грНеделя 3 – 600гр)3. Сообщить сколько всего потребуется протеина. (Всего – 1800гр)Данные от пользователя:1. Частота приема – Число;2. Количество протеина в будние – число;3. Количество протеина в выходные – число;4. Количество дней приема – Число
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот