Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [VB6] Построение матрицы вариантов раскроя


Автор: max1m9 7.6.2010, 16:01
Здравствуйте!Хотел бы спросить совета хорошо разбирающихся в 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:14
Модератор: 
1) Используйте тег "Код".
2) Используйте форматирование.

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)