Комбинаторика простая программа сочетание М в массиве Н
Есть код:
Он выдает, следующее:
А1А2
А1А3
А1А4
А2А3
А2А4
А3А4
Но мне сказали, что это фиксированная фигня, мол нужно форму сделать, в которой два поля и можно туда вставить число например: 5 это типо число сочетаний и 10 это длинна значений массива.
Мне сказали, это просто, а так как я новичок, мне вообще чет тяжело въехать)) Помогите пожалуйста!
&НаКлиенте
Процедура Команда1(Команда)
Массив = Новый Массив(4);
Массив[0] = "А1";
Массив[1] = "А2";
Массив[2] = "А3";
Массив[3] = "А4";
Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
Сообщить(Массив[Индекс1] + Массив[Индекс2]);
КонецЦикла;
КонецЦикла;
ПоказатьОн выдает, следующее:
А1А2
А1А3
А1А4
А2А3
А2А4
А3А4
Но мне сказали, что это фиксированная фигня, мол нужно форму сделать, в которой два поля и можно туда вставить число например: 5 это типо число сочетаний и 10 это длинна значений массива.
Мне сказали, это просто, а так как я новичок, мне вообще чет тяжело въехать)) Помогите пожалуйста!
Найденные решения
(29) Ну, если перепереть (31) с C++ на язык родных осин, то получится это.
Прикрепленные файлы:
Комбинации.epf
Остальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1) так?
Процедура Рассчитать(Команда)
СписокРезультата.Очистить(); // СписокРезультата это СписокЗначений на форме
Если ДлинаМассива<=0 Или ЧислоСочитаний <=0 Тогда Возврат; КонецЕсли;
Массив = Новый Массив(ДлинаМассива);
Для к = 1 По ДлинаМассива Цикл
Массив[к-1] = "А"+к;
КонецЦикла;
Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
СписокРезультата.Добавить(Массив[Индекс1] + Массив[Индекс2]);
Если СписокРезультата.Количество() >= ЧислоСочитаний Тогда
Перейти ~m1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
~m1:
КонецПроцедуры
Показать
(2) Да, типо я уже задал массив и количество сочетаний, а нужно, чтобы он задавался например цифрой ("Чтобы выдавала все сочетания по М элементам из Н списка), если можно заменить чем-то массив, то ничего страшного, лишь бы я ввел в поле предположим сочетания 2 элементов из списка 5 и мне выдало 1,1 1,2 1,3 1,4 1,2 2,2 2,3 и так далее и типо вводишь так любые числа и оно работало, я вот ума не приложу как это надо выродить, прошу помощи.
Создаете обработку, создаете форму (лучше упр), в реквизитах формы справа добавляете два реквизита с типом Число (мДлина, мКоличество) и перетаскиваете их на форму. Потом, справа, в разделе "Команды", создаете команду "Расчёт". Перетягиваете и её на форму. Затем по команде правой кнопкой мыши "Создать процедуру на клиенте", в тело процедуры пишете свой код, заменив необходимое на мДлина и мКоличество.
(4) подскажите в конце заменив необходимое на мДлина и мКоличество, я подставил вместо массива и индекса вот так:
Выдает ошибку:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7)}: Получение элемента по индексу для значения не определено
мДлина[0] = "А1";
Или я Вас не правильно понял?
&НаКлиенте
Процедура Команда1(Команда)
мДлина = Новый Массив(4);
мДлина[0] = "А1";
мДлина[1] = "А2";
мДлина[2] = "А3";
мДлина[3] = "А4";
Для мКоличество1 = 0 По мДлина.ВГраница() - 1 Цикл
Для мКоличество2 = мКоличество1 + 1 По мДлина.ВГраница() Цикл
Сообщить(мДлина[мКоличество1] + мДлина[мКоличество2]);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
ПоказатьВыдает ошибку:
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7)}: Получение элемента по индексу для значения не определено
мДлина[0] = "А1";
Или я Вас не правильно понял?
(14) Зачем это здесь? Я прекрасно знаю, что переменные можно называть Строка, Структура, Массив, да хоть ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, я не против. Если вчитаться в (5), то можно увидеть, что ТС добавил числовой реквизит мДлина и дальше пытался работать с ним как с массивом, именно на эту ошибку я ему и указал.
(20) Вот так
&НаКлиенте
Процедура Команда1(Команда)
мДлина = Новый Массив(мДлина);
Для мКоличество = 0 По мДлина.ВГраница() - 1 Цикл
Для мКоличество = мКоличество + 1 По мДлина.ВГраница() Цикл
Сообщить(мДлина[мКоличество] + мДлина[мКоличество]);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Показать
(21) так делать не надо. У вас есть числовой реквизит мДлина и вы этому числовому реквизиту пытаетесь присвоить значение массив. Не тут-то было - он как был числом, так и остался. Для массива вводите локальную переменную:
Массив = Новый Массив(мДлина);
Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
Сообщить(Массив[Индекс1] + Массив[Индекс2]);
КонецЦикла;
КонецЦикла;
(22)
Если брать Ваш код, то конфигуратор ругается говорит, что преобразование к типу число не может быть выполнено.
Массив = Новый Массив(мДлина);
Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
Сообщить(Массив[Индекс1] + Массив[Индекс2]);
КонецЦикла;
КонецЦикла;
Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
Сообщить(Массив[Индекс1] + Массив[Индекс2]);
КонецЦикла;
КонецЦикла;
Если брать Ваш код, то конфигуратор ругается говорит, что преобразование к типу число не может быть выполнено.
(23) Так массив-то заполнить нужно.
Массив = Новый Массив;
Для сч = 1 по мДлина Цикл
Массив.Добавить("А" + сч)
КонецЦикла;
Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
Сообщить(Массив[Индекс1] + Массив[Индекс2]);
КонецЦикла;
КонецЦикла;
ПоказатьЕсли не важно, чем будет заполнен массив элементов, то заполнять его, как в (24).
Тогда на форме разместить два реквизита типа "Число" - "Длина" (массива) и "Количество" (длина сочетания).
По статьям выше разобраться, как генерировать очередное сочетание.
Потом переложить на 1С - все нужные типы есть.
(29) Ну, если перепереть (31) с C++ на язык родных осин, то получится это.
Прикрепленные файлы:
Комбинации.epf
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)