Сколько надо купить заготовок длиной 150 см? - VB

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите, пожалуйста, с решением задачи. Принципиально важно узнать: хватит ли 93 заготовки? Линейный раскрой прутков. Сколько надо купить заготовок длиной 150 см, чтобы выполнить полностью заказ? - длина 33 см — количество: 151 штука; - длина 27 см — количество: 206 штук; - длина 19 см — количество: 163 штуки.

Решение задачи: «Сколько надо купить заготовок длиной 150 см?»

textual
Листинг программы
Private Sub Command1_Click()
     Dim arr(), res, ArrB() As typeBrd, k As Long, dL As Long, t0 As Long, tL As Long, st As String
     Dim n As Long, i As Long, j As Long, LB As Long, sum As Long, s As String
     Call GetData(ArrB(), n)
     LB = Val(Text3.Text): List1.Clear: Label2.Visible = True: txtRes.Text = "": txtRes1.Text = "": Command1.Enabled = False: DoEvents
     ReDim arr(1 To 1)
     For i = 1 To n
         For j = 1 To ArrB(i).CntB
            k = k + 1
            ReDim Preserve arr(1 To k): arr(k) = ArrB(i).LenB
         Next j
     Next i
m:   Do
       sum = 0: s = ""
       Call compRes(arr, k)
       res = LongSumEl(arr(), LB, dL)
       If VarType(res) = 8195 Then
          For i = LBound(res) To UBound(res)
               If res(i) <> 0 Then
                   s = s & res(i) & "   ": sum = sum + res(i)
                   For j = 1 To k
                        If res(i) = arr(j) Then res(i) = 0: arr(j) = 0  '
                   Next j
               End If
          Next i
          Label2.Caption = Val(k / 100): DoEvents
          If sum = 0 Then GoTo m1
          st = st & tL + 1 & "." & vbTab & s & "   Отходы  " & LB - sum & vbCrLf
          t0 = t0 + (LB - sum): tL = tL + 1
       Else
          If sumRes(arr, k) < LB And res <> LB Then
            For j = 1 To k
                  If arr(j) <> 0 Then s = s & arr(j) & "   ": arr(j) = 0
            Next j
            st = st & tL + 1 & "." & vbTab & s & "   Отходы  " & res & vbCrLf
            t0 = t0 + Val(res): tL = tL + 1
            GoTo m1
          End If
          Exit Do
       End If
    Loop
    
    If dL <= maxL(ArrB(), n) Then dL = dL + 5: GoTo m
m1:
    'Вывод результата
     On Error Resume Next
    List1.AddItem " "
    List1.AddItem "Всего потребуется заготовок " & tL
    List1.AddItem "Отходы (всего ) " & t0
    List1.AddItem "Отходы (заготовки, шт) " & Round(t0 / LB, 2)
    List1.AddItem "Отходы (всего, %) " & Round(((t0 / LB) / tL) * 100, 2)
    txtRes.Text = st
    Label2.Visible = False: Command1.Enabled = True: DoEvents
    txtRes1.Text = compStr(st)
    
End Sub
Private Function compStr(s As String) As String
    Dim st, i As Long, j As Long, n As Long, tmp1 As String, tmp2 As String, k As Long
    st = Split(s, vbCrLf): n = UBound(st)
    tmp1 = Split(st(0), vbTab)(1)
    k = 1
    For i = 1 To n
        If st(i) <> "" Then
         tmp2 = Split(st(i), vbTab)(1)
         If tmp1 = tmp2 Then
             k = k + 1
         Else
             compStr = compStr & k & " раз " & vbTab & tmp1 & vbCrLf
             k = 1
             If st(i) <> "" Then tmp1 = Split(st(i), vbTab)(1)
         End If
        End If
    Next i
    compStr = compStr & k & " раз " & vbTab & tmp1 & vbCrLf
End Function
Private Sub compRes(res, n As Long)
    Dim a() As Variant, i As Long, k As Long
    ReDim a(1 To 1)
    For i = 1 To n
        If res(i) <> 0 Then k = k + 1: ReDim Preserve a(1 To k): a(k) = res(i)
    Next i
    res = a: n = k
End Sub
Private Function sumRes(a(), n As Long) As Long
    Dim i As Long
    For i = 1 To n
        sumRes = sumRes + a(i)
    Next i
End Function
Private Function maxL(ArrB() As typeBrd, n) As Long
    Dim i As Long: maxL = ArrB(1).LenB
    For i = 1 To n
        If ArrB(i).LenB > maxL And ArrB(i).CntB > 0 Then maxL = ArrB(i).LenB
    Next i
End Function
Private Sub GetData(ArrB() As typeBrd, n As Long)
     n = 5
     ReDim ArrB(1 To n)
     Dim i As Long
     For i = 1 To n
         ArrB(i).LenB = Val(Text1(i - 1).Text)
         ArrB(i).CntB = Val(Text2(i - 1).Text)
     Next i
End Sub
 
Function LongSumEl(arr(), sm As Long, Optional ds As Long = 0)
 
    Dim out&(), i&, j&, k&, n&, L&, sm1&
    
    n = sm ' + ds
    sm1 = sm - ds
    
    If n > 80000000 Or n < 0 Then Exit Function
    ReDim a&(n)
    For i = 1 To n: a(i) = -1: Next i
    For i = 1 To UBound(arr)
        For j = n - arr(i) To 0 Step -1
            If a(j) >= 0 Then
                k = j + arr(i)
                If a(k) = -1 Then a(k) = j
                If k >= sm1 Then
                    Do
                        L = L + 1
                        ReDim Preserve out&(1 To L)
                        out(L) = k - a(k)
                        k = a(k)
                    Loop While k
                    LongSumEl = out
                    Exit Function
                End If
            End If
    Next j, i
    For i = sm To 1 Step -1
        If a(i) >= 0 Then Exit For
    Next i
    LongSumEl = sm - i
End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы