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

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

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

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

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

textual
Листинг программы
  1. Private Sub Command1_Click()
  2.      Dim arr(), res, ArrB() As typeBrd, k As Long, dL As Long, t0 As Long, tL As Long, st As String
  3.      Dim n As Long, i As Long, j As Long, LB As Long, sum As Long, s As String
  4.      Call GetData(ArrB(), n)
  5.      LB = Val(Text3.Text): List1.Clear: Label2.Visible = True: txtRes.Text = "": txtRes1.Text = "": Command1.Enabled = False: DoEvents
  6.      ReDim arr(1 To 1)
  7.      For i = 1 To n
  8.          For j = 1 To ArrB(i).CntB
  9.             k = k + 1
  10.             ReDim Preserve arr(1 To k): arr(k) = ArrB(i).LenB
  11.          Next j
  12.      Next i
  13. m:   Do
  14.        sum = 0: s = ""
  15.        Call compRes(arr, k)
  16.        res = LongSumEl(arr(), LB, dL)
  17.        If VarType(res) = 8195 Then
  18.           For i = LBound(res) To UBound(res)
  19.                If res(i) <> 0 Then
  20.                    s = s & res(i) & "   ": sum = sum + res(i)
  21.                    For j = 1 To k
  22.                         If res(i) = arr(j) Then res(i) = 0: arr(j) = 0  '
  23.                   Next j
  24.                End If
  25.           Next i
  26.           Label2.Caption = Val(k / 100): DoEvents
  27.           If sum = 0 Then GoTo m1
  28.           st = st & tL + 1 & "." & vbTab & s & "   Отходы  " & LB - sum & vbCrLf
  29.           t0 = t0 + (LB - sum): tL = tL + 1
  30.        Else
  31.           If sumRes(arr, k) < LB And res <> LB Then
  32.             For j = 1 To k
  33.                   If arr(j) <> 0 Then s = s & arr(j) & "   ": arr(j) = 0
  34.             Next j
  35.             st = st & tL + 1 & "." & vbTab & s & "   Отходы  " & res & vbCrLf
  36.             t0 = t0 + Val(res): tL = tL + 1
  37.             GoTo m1
  38.           End If
  39.           Exit Do
  40.        End If
  41.     Loop
  42.    
  43.     If dL <= maxL(ArrB(), n) Then dL = dL + 5: GoTo m
  44. m1:
  45.     'Вывод результата
  46.     On Error Resume Next
  47.     List1.AddItem " "
  48.     List1.AddItem "Всего потребуется заготовок " & tL
  49.     List1.AddItem "Отходы (всего ) " & t0
  50.     List1.AddItem "Отходы (заготовки, шт) " & Round(t0 / LB, 2)
  51.     List1.AddItem "Отходы (всего, %) " & Round(((t0 / LB) / tL) * 100, 2)
  52.     txtRes.Text = st
  53.     Label2.Visible = False: Command1.Enabled = True: DoEvents
  54.     txtRes1.Text = compStr(st)
  55.    
  56. End Sub
  57. Private Function compStr(s As String) As String
  58.     Dim st, i As Long, j As Long, n As Long, tmp1 As String, tmp2 As String, k As Long
  59.     st = Split(s, vbCrLf): n = UBound(st)
  60.     tmp1 = Split(st(0), vbTab)(1)
  61.     k = 1
  62.     For i = 1 To n
  63.         If st(i) <> "" Then
  64.          tmp2 = Split(st(i), vbTab)(1)
  65.          If tmp1 = tmp2 Then
  66.              k = k + 1
  67.          Else
  68.              compStr = compStr & k & " раз " & vbTab & tmp1 & vbCrLf
  69.              k = 1
  70.              If st(i) <> "" Then tmp1 = Split(st(i), vbTab)(1)
  71.          End If
  72.         End If
  73.     Next i
  74.     compStr = compStr & k & " раз " & vbTab & tmp1 & vbCrLf
  75. End Function
  76. Private Sub compRes(res, n As Long)
  77.     Dim a() As Variant, i As Long, k As Long
  78.     ReDim a(1 To 1)
  79.     For i = 1 To n
  80.         If res(i) <> 0 Then k = k + 1: ReDim Preserve a(1 To k): a(k) = res(i)
  81.     Next i
  82.     res = a: n = k
  83. End Sub
  84. Private Function sumRes(a(), n As Long) As Long
  85.     Dim i As Long
  86.     For i = 1 To n
  87.         sumRes = sumRes + a(i)
  88.     Next i
  89. End Function
  90. Private Function maxL(ArrB() As typeBrd, n) As Long
  91.     Dim i As Long: maxL = ArrB(1).LenB
  92.     For i = 1 To n
  93.         If ArrB(i).LenB > maxL And ArrB(i).CntB > 0 Then maxL = ArrB(i).LenB
  94.     Next i
  95. End Function
  96. Private Sub GetData(ArrB() As typeBrd, n As Long)
  97.      n = 5
  98.      ReDim ArrB(1 To n)
  99.      Dim i As Long
  100.      For i = 1 To n
  101.          ArrB(i).LenB = Val(Text1(i - 1).Text)
  102.          ArrB(i).CntB = Val(Text2(i - 1).Text)
  103.      Next i
  104. End Sub
  105.  
  106. Function LongSumEl(arr(), sm As Long, Optional ds As Long = 0)
  107.  
  108.     Dim out&(), i&, j&, k&, n&, L&, sm1&
  109.    
  110.     n = sm ' + ds
  111.    sm1 = sm - ds
  112.    
  113.     If n > 80000000 Or n < 0 Then Exit Function
  114.     ReDim a&(n)
  115.     For i = 1 To n: a(i) = -1: Next i
  116.     For i = 1 To UBound(arr)
  117.         For j = n - arr(i) To 0 Step -1
  118.             If a(j) >= 0 Then
  119.                 k = j + arr(i)
  120.                 If a(k) = -1 Then a(k) = j
  121.                 If k >= sm1 Then
  122.                     Do
  123.                         L = L + 1
  124.                         ReDim Preserve out&(1 To L)
  125.                         out(L) = k - a(k)
  126.                         k = a(k)
  127.                     Loop While k
  128.                     LongSumEl = out
  129.                     Exit Function
  130.                 End If
  131.             End If
  132.     Next j, i
  133.     For i = sm To 1 Step -1
  134.         If a(i) >= 0 Then Exit For
  135.     Next i
  136.     LongSumEl = sm - i
  137. End Function

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


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

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

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы