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

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 30 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 30 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 Сейчас в теме
37. OneEset 10.10.19 13:31 Сейчас в теме
(36) Боги праведные это то, что нужно! Вы меня спасли! Спасибо большое!
38. OneEset 10.10.19 13:32 Сейчас в теме
(36) Осталось только в коде разобраться, если что я Вам тогда в ЛС напишу, чтобы я смог рассказать как работает эта система)
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день