Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VB6] Построение матрицы вариантов раскроя 
:(
    Опции темы
max1m9
Дата 7.6.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 13.12.2009

Репутация: нет
Всего: нет



Здравствуйте!Хотел бы спросить совета хорошо разбирающихся в VBA людей(сам увлекаюсь VBA около года).
Есть следующая задача:
Пусть имеются заготовки длиной L м. Из них нужно нарезать m деталей, длины которых задаются элементами массива Li. Требуется получить матрицу A вариантов раскроя.
У меня получается следующее:

Код

' Построение матрицы вариантов раскроя
Const i0 = 8, j0 = 2 ' Координаты левой верхней ячеки «матрицы»
Dim m As Integer, N As Integer, L As Single
Dim Li() As Single, Ki() As Integer
' Создание одного варианта раскроя
Sub Cre_Var(ByVal k)
Dim Lk, ii
If k >= m Then Exit Sub
Lk = 0 ' Какая общая длина предыдущих вариантов
For ii = 1 To k
Lk = Lk + Ki(ii) * Li(ii)
Next ii
L0 = L - Lk ' Остаток
k = k + 1
Ki(k) = Int(L0 / Li(k)) ' Max количество одной след. детали
Call Cre_Var(k) ' Рекурсивный вызов
End Sub
Sub Matr_Raskr()
Dim Lk, ii
L = Cells(1, 3) ' Длина заготовки
m = Cells(2, 3) ' Количество деталей
ReDim Li(1 To m) As Single ' Описываем массив «длин» деталей
ReDim Ki(1 To m) As Integer ' Описываем массив количества деталей
For i = 1 To m
Li(i) = Cells(4, i + 1) ' Формируем массив «длин» деталей
Next i
N = 0
Ki(1) = Int(L / Li(1)) ' Max количество одной 1-ой детали
For i = 1 To m - 1
Lk = 0
For ii = 1 To i
Lk = Lk + Ki(ii) * Li(ii)
Next ii
Ki(i) = Int(Lk / Li(i)) ' Max количество одной i-той детали
While Ki(i) > 0
N = N + 1
' Очистка одного варианта
For ii = i + 1 To m
Ki(ii) = 0
Next ii
' Создание нового варианта
Call Cre_Var(i)
' Вывод варианта
Call Out_Variant(N, Ki, Li)
' Очистка одного варианта
For ii = 1 To i - 1
Ki(ii) = 0
Next ii
Ki(i) = Ki(i) - 1
Wend
Next i
End Sub
' Вывод варианта
Sub Out_Variant(N, Ki, Li)
Cells(i0 + N - 1, j0 - 1) = N
Ls = 0 ' Общая длина варианта
For j = 1 To m
Cells(i0 + N - 1, j0 + j - 1) = Ki(j)
Ls = Ls + Ki(j) * Li(j)
Next j
Cells(i0 + N - 1, j0 + m + 1) = Ls
End Sub

Проблема состоит в том,что выводиться лишний вариант,при том даже превышающий имеющиеся остатки.

Это сообщение отредактировал(а) Akina - 7.6.2010, 16:13
PM MAIL   Вверх
Akina
Дата 7.6.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Модератор: 
1) Используйте тег "Код".
2) Используйте форматирование.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 7.6.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.