Комбинаторика простая программа сочетание М в массиве Н

1. OneEset 09.10.19 09:26 Сейчас в теме
Есть код:

&НаКлиенте
Процедура Команда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 это длинна значений массива.

Мне сказали, это просто, а так как я новичок, мне вообще чет тяжело въехать)) Помогите пожалуйста!
+
Вознаграждение за ответ
Показать полностью
Найденные решения
34. antz 10.10.19 11:07 Сейчас в теме +0.3 $m
(29) Ну, если перепереть (31) с C++ на язык родных осин, то получится это.
Прикрепленные файлы:
Комбинации.epf
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. spacecraft 09.10.19 11:08 Сейчас в теме
(1) так?
Процедура Рассчитать(Команда)
	СписокРезультата.Очистить(); // СписокРезультата это СписокЗначений на форме
	Если ДлинаМассива<=0 Или ЧислоСочитаний <=0 Тогда Возврат; КонецЕсли;
	Массив = Новый Массив(ДлинаМассива);
	Для к = 1 По ДлинаМассива Цикл
		Массив[к-1] = "А"+к;
	КонецЦикла;
	Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
        Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
       		СписокРезультата.Добавить(Массив[Индекс1] + Массив[Индекс2]);
			Если СписокРезультата.Количество() >= ЧислоСочитаний Тогда
				Перейти ~m1;
			КонецЕсли;
        КонецЦикла;
	КонецЦикла;
	~m1:
КонецПроцедуры
Показать
+
7. OneEset 09.10.19 12:39 Сейчас в теме
(6) А передать в формы, где вводятся значения, что именно нужно вписать?
+
11. spacecraft 09.10.19 13:30 Сейчас в теме
(7) ДлинаМассива и ЧислоСочитаний это реквизиты формы тип Число.
+
2. Smartpk 9 09.10.19 09:30 Сейчас в теме
Что именно является фиксированной фигней? Массив?
+
3. OneEset 09.10.19 09:37 Сейчас в теме
(2) Да, типо я уже задал массив и количество сочетаний, а нужно, чтобы он задавался например цифрой ("Чтобы выдавала все сочетания по М элементам из Н списка), если можно заменить чем-то массив, то ничего страшного, лишь бы я ввел в поле предположим сочетания 2 элементов из списка 5 и мне выдало 1,1 1,2 1,3 1,4 1,2 2,2 2,3 и так далее и типо вводишь так любые числа и оно работало, я вот ума не приложу как это надо выродить, прошу помощи.
+
4. Smartpk 9 09.10.19 09:51 Сейчас в теме
Создаете обработку, создаете форму (лучше упр), в реквизитах формы справа добавляете два реквизита с типом Число (мДлина, мКоличество) и перетаскиваете их на форму. Потом, справа, в разделе "Команды", создаете команду "Расчёт". Перетягиваете и её на форму. Затем по команде правой кнопкой мыши "Создать процедуру на клиенте", в тело процедуры пишете свой код, заменив необходимое на мДлина и мКоличество.
+
5. OneEset 09.10.19 10:33 Сейчас в теме
(4) подскажите в конце заменив необходимое на мДлина и мКоличество, я подставил вместо массива и индекса вот так:



&НаКлиенте
Процедура Команда1(Команда)
	
	мДлина = Новый Массив(4);

    мДлина[0] = "А1"; 
    мДлина[1] = "А2";
    мДлина[2] = "А3";
    мДлина[3] = "А4";
	
	Для мКоличество1 = 0 По мДлина.ВГраница() - 1 Цикл
		Для мКоличество2 = мКоличество1 + 1 По мДлина.ВГраница() Цикл
       Сообщить(мДлина[мКоличество1] + мДлина[мКоличество2]);
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры
Показать


Выдает ошибку:

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7)}: Получение элемента по индексу для значения не определено
мДлина[0] = "А1";

Или я Вас не правильно понял?
+
8. antz 09.10.19 12:53 Сейчас в теме
(5)

МассивЭлементов = Новый Массив(мДлина)


Далее работаете с переменной МассивЭлементов.
+
9. spacecraft 09.10.19 13:30 Сейчас в теме
(8) это предложение или указание?
+
10. OneEset 09.10.19 13:30 Сейчас в теме
12. spacecraft 09.10.19 13:31 Сейчас в теме
(10) этот вопрос не вам был задан.
+
13. antz 09.10.19 14:24 Сейчас в теме
14. spacecraft 09.10.19 14:57 Сейчас в теме
(13) ну тогда я тут это оставлю... чтобы приказы по адресу перенаправили.
Прикрепленные файлы:
+
15. antz 09.10.19 15:10 Сейчас в теме
(14) Зачем это здесь? Я прекрасно знаю, что переменные можно называть Строка, Структура, Массив, да хоть ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент, я не против. Если вчитаться в (5), то можно увидеть, что ТС добавил числовой реквизит мДлина и дальше пытался работать с ним как с массивом, именно на эту ошибку я ему и указал.
+
16. spacecraft 09.10.19 15:22 Сейчас в теме
(15) а, извини, не понял. Думал это был мне ответ на Массив = Новый Массив.
+
33. OneEset 10.10.19 10:51 Сейчас в теме
(16) Поставил вознаграждение, нужна помощь!
+
17. OneEset 09.10.19 15:48 Сейчас в теме
(8) То есть мне нужно оставить всё как есть, только добавить в параметры (мДлина) как у Вас?
+
18. antz 09.10.19 15:48 Сейчас в теме
(17) да, тогда будет создаваться массив нужной длины.
+
19. OneEset 09.10.19 15:59 Сейчас в теме
(18) {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7)}: Значение не является значением объектного типа (ВГраница)
Для мКоличество = 0 По мДлина.ВГраница() - 1 Цикл
+
20. antz 09.10.19 16:20 Сейчас в теме
(19) не трогайте мДлина, это не массив, это число :) Как сейчас код выглядит?
+
21. OneEset 09.10.19 16:34 Сейчас в теме
(20) Вот так



&НаКлиенте
Процедура Команда1(Команда)
	
	мДлина = Новый Массив(мДлина);
	
	Для мКоличество = 0 По мДлина.ВГраница() - 1 Цикл
		Для мКоличество = мКоличество + 1 По мДлина.ВГраница() Цикл
       Сообщить(мДлина[мКоличество] + мДлина[мКоличество]);
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры
Показать
+
22. antz 09.10.19 16:43 Сейчас в теме
(21) так делать не надо. У вас есть числовой реквизит мДлина и вы этому числовому реквизиту пытаетесь присвоить значение массив. Не тут-то было - он как был числом, так и остался. Для массива вводите локальную переменную:

    Массив = Новый Массив(мДлина);
    
    Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
        Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
       Сообщить(Массив[Индекс1] + Массив[Индекс2]);
        КонецЦикла;
    КонецЦикла;
+
23. OneEset 09.10.19 16:54 Сейчас в теме
(22)
Массив = Новый Массив(мДлина);

Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
Сообщить(Массив[Индекс1] + Массив[Индекс2]);
КонецЦикла;
КонецЦикла;



Если брать Ваш код, то конфигуратор ругается говорит, что преобразование к типу число не может быть выполнено.
+
24. antz 09.10.19 17:00 Сейчас в теме
(23) Так массив-то заполнить нужно.

Массив = Новый Массив;

Для сч = 1 по мДлина Цикл
    Массив.Добавить("А" + сч)
КонецЦикла;

Для Индекс1 = 0 По Массив.ВГраница() - 1 Цикл
    Для Индекс2 = Индекс1 + 1 По Массив.ВГраница() Цикл
        Сообщить(Массив[Индекс1] + Массив[Индекс2]);
    КонецЦикла;
КонецЦикла;
Показать
+
31. comptr 31 10.10.19 08:56 Сейчас в теме
https://prog-cpp.ru/combinations

Если не важно, чем будет заполнен массив элементов, то заполнять его, как в (24).
Тогда на форме разместить два реквизита типа "Число" - "Длина" (массива) и "Количество" (длина сочетания).
По статьям выше разобраться, как генерировать очередное сочетание.
Потом переложить на 1С - все нужные типы есть.
+
32. OneEset 10.10.19 10:20 Сейчас в теме
(31)
Потом переложить на 1С - все нужные типы есть.


Хорошая статья, но она меня не спасает, потому что там C++, а я и 1С-то не очень хорошо знаю, так как новичок в этом деле))
+
25. antz 09.10.19 17:06 Сейчас в теме
(23) и длину при создании можно не указывать.
+
26. OneEset 09.10.19 17:19 Сейчас в теме
(25) а поля из формы к чему прицеплены?
+
27. antz 09.10.19 17:46 Сейчас в теме
(26) ну, это тоже статичная фигня, по большому счету, генерирует список из мДлина (это поле формы) по 2. Чтобы запилить список из мДлина по мКоличество - тут я под вечер не соображу)
+
30. OneEset 10.10.19 08:21 Сейчас в теме
(27) Поставил вознаграждение, очень нужна помощь.
+
28. comptr 31 10.10.19 07:53 Сейчас в теме
Может быть поздно влезаю, но зачем тут вообще массивы?
Формула сочетаний С из n по k легко гуглится, там только факториалы нужны.
Или нужно вывести все сочетания?
До сих пор был только код, выводящий C из n по 2.
+
29. OneEset 10.10.19 08:20 Сейчас в теме
(28) Здравствуйте, ещё актуально. Нужно чтобы было 2 поля в одном количество элементов по которым нужно составить сочетания в другом список. Если на 1С это реально, то я буду очень признателен, ибо это очень важно.
+
34. antz 10.10.19 11:07 Сейчас в теме +0.3 $m
(29) Ну, если перепереть (31) с C++ на язык родных осин, то получится это.
Прикрепленные файлы:
Комбинации.epf
+
35. OneEset 10.10.19 11:33 Сейчас в теме
(34) Вечером попробую запустить. А вы уже пробовали? Работает?
+
36. antz 10.10.19 11:36 Сейчас в теме
(35) Пробовал, работает.
+
37. OneEset 10.10.19 13:31 Сейчас в теме
(36) Боги праведные это то, что нужно! Вы меня спасли! Спасибо большое!
+
38. OneEset 10.10.19 13:32 Сейчас в теме
(36) Осталось только в коде разобраться, если что я Вам тогда в ЛС напишу, чтобы я смог рассказать как работает эта система)
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот