207 / 23 / 6
Регистрация: 12.06.2012
Сообщений: 235

Нужно рассчитать как выгодно купить товар алгоритмически

09.09.2013, 06:06. Показов 1291. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Задача:
Требуется купить 5шт. одного и того же товара, но у всех разные цены и не у каждого есть требуемое количество, итак:
Магазин1, цена 10р., доступно 1шт. товара
Магазин2, цена 20р., доступно 2шт. товара
Магазин3, цена 40р., доступно 5шт. товара
Магазин4, цена 30р., доступно 3шт. товара

Нужно получить план с выгодной покупкой, т.е.:
а) Купить 1шт. в Магазине1
б) Купить 1шт. в Магазине2
в) Купить 3шт. в Магазине4

Как алгоритмически всё реализовать? Как посравнивать кучу цен с учётом по количеству?

Думал что такой код пройдёт, но нет, на выше приведённой задаче - не срабатывает.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Dim arrTemp(2,3)    As Single     '0-номер магазина;1-цена товара;3-доступное количество;
Dim ia              As Integer
Dim ib              As Integer    'номер в массиве с минимальной ценой
Dim iCount          As Integer    'требуемое кол-во
 
arrTemp(0,0) = 1
arrTemp(1,0) = 10
arrTemp(2,0) = 1
 
arrTemp(0,1) = 2
arrTemp(1,1) = 20
arrTemp(2,1) = 2
 
arrTemp(0,2) = 3
arrTemp(1,2) = 40
arrTemp(2,2) = 4
 
arrTemp(0,3) = 4
arrTemp(1,3) = 30
arrTemp(2,3) = 3
 
 
For ia = 0 To UBound(arrTemp, 2)            
   If (arrTemp(1, ib) = 0 Or arrTemp(1, ib) > arrTemp(1, ia) And (arrTemp(1, ia) > 0)) And (arrTemp(2, ia) >= iCount) Then
          ib = ia
   End If
Next
Ну уже вообще голова не варит. И с кейсами пытался, и так и сяк... Чего-то не дотумкиваю, где-то.
Может кто посвежее будет на голову, да подскажет решеньице?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2013, 06:06
Ответы с готовыми решениями:

Как программно купить товар на амазоне?
Подскажите как программно купить товар на амазоне? Интересуют методы - api и без них. (если api, то какие, где) Может статьи где...

Как правильно рассчитать бракованный товар?
у меня проект предприятие по выпуску одежды, есть классы по партии, движении товаров и сотрудников. Как правильнее всего реализовать расчет...

"купить товар"
История вопроса такова. Интернет магазин продает "товар". ("товар" - 3000 запросов в месяц) Несколько раз прогонялся по закладкам с...

14
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
09.09.2013, 09:20
Можно попробовать так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Option Explicit
 
Private Type typeShop      'пользовательский тип typeShop
     Number As Integer     'номер магазина
     Count As Integer      'количество товара
     Price As Single       'цена
End Type
 
Private Sub Command1_Click()
    Dim Shop(1 To 4) As typeShop                         '  объявляем массив из 4-х магазинов
    Dim i As Integer, j As Integer, NeedProd As Integer  '  сколько нужно товара
    Cls
    'заполняем массив ценами и количеством товара в магазинах
    Shop(1).Number = 1: Shop(1).Count = 1: Shop(1).Price = 10
    Shop(2).Number = 2: Shop(2).Count = 2: Shop(2).Price = 20
    Shop(3).Number = 3: Shop(3).Count = 5: Shop(3).Price = 40
    Shop(4).Number = 4: Shop(4).Count = 3: Shop(4).Price = 30
    StatShop Shop()
    NeedProd = InputBox("Сколько нужно товара?", "Ввод данных", 5)
    Print "Необходимое количество товара  " & NeedProd
    Call SortMinPrice(Shop()) 'сортируем массив магазинов по цене
    'идём во все магазины, начиная с первого
    For i = 1 To UBound(Shop)
         'Делаем покупки до тех пор, пока в магазине не кончится товар или не наберём нужное нам количество
         j = 0
         Do Until Shop(i).Count = 0 Or NeedProd = 0
            Shop(i).Count = Shop(i).Count - 1 'при каждой покупке уменьшаем количество товара в магазине на 1
            NeedProd = NeedProd - 1           'при каждой покупке уменьшаем количество нужного нам товара на 1
            j = j + 1                         'считаем количество покупок в каждом магазине
         Loop
         If j > 0 Then Print "Покупаем  в магазине № " & Shop(i).Number & "  " & j & " шт."
         'если всё купили - заканчиваем походы по магазинам
         If NeedProd = 0 Then Exit For
    Next i
    'если в магазинах кончился товар и мы не набрали нобходимого нам количества
    If NeedProd > 0 Then MsgBox "В магазинах недостаточно товара"
    StatShop Shop()
End Sub
 
'процедура сортировки магазинов по возрастанию цены
Private Sub SortMinPrice(ByRef S() As typeShop)
    Dim i As Integer, j As Integer, temp As Single, t As typeShop
    For i = 1 To UBound(S)
       temp = S(i).Price
       For j = i To UBound(S) - 1
           If temp > S(j + 1).Price Then
               t = S(j + 1)
               S(j + 1) = S(j)
               S(j) = t
           End If
       Next j
    Next i
End Sub
 
'процедура выводит на форму сведения о наличии товара в магазинах
Private Sub StatShop(ByRef S() As typeShop)
    Dim i As Integer
    Print
    Print "Наличие товара в магазинах : " & vbCrLf;
    For i = 1 To UBound(S)
         Print "Магазин № "; S(i).Number & "  Цена "; S(i).Price & "  Количество товара " & S(i).Count
    Next i
    Print
End Sub
Миниатюры
Нужно рассчитать как выгодно купить товар алгоритмически  
1
207 / 23 / 6
Регистрация: 12.06.2012
Сообщений: 235
09.09.2013, 11:42  [ТС]
Уффф, ещё не пробовал, но думаю всё должно заработать. Спасибо что откликнулись.
Забыл ещё, одну важную деталь, нужно в каком-то месте поставить опцию, мол, покупать только в том месте, и по самой минимальной цене, но где есть необходимое количество сразу. Т.е. результат должен быть, если опираться на изначальную задачу:
а) Купить 5шт. в Магазине3
0
09.09.2013, 12:58

Не по теме:

Цитата Сообщение от sergeos Посмотреть сообщение
Забыл ещё, одну важную деталь
Вот обычно отсюда и начинают расти костыли :D

1
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
09.09.2013, 13:39
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Option Explicit
 
Private Type typeShop      'пользовательский тип typeShop
     Number As Integer     'номер магазина
     Count As Integer      'количество товара
     Price As Single       'цена
End Type
 
Private Sub Command1_Click()
    Dim Shop(1 To 4) As typeShop                         '  объявляем массив из 4-х магазинов
    Dim i As Integer, j As Integer, NeedProd As Integer  '  сколько нужно товара
    Cls
    'заполняем массив ценами и количеством товара в магазинах
    Shop(1).Number = 1: Shop(1).Count = 1: Shop(1).Price = 10
    Shop(2).Number = 2: Shop(2).Count = 2: Shop(2).Price = 20
    Shop(3).Number = 3: Shop(3).Count = 5: Shop(3).Price = 40
    Shop(4).Number = 4: Shop(4).Count = 3: Shop(4).Price = 30
    Call StatShop(Shop())
    NeedProd = InputBox("Сколько нужно товара?", "Ввод данных", 5)
    Print "Необходимое количество товара  " & NeedProd
    Call SortMinPrice(Shop()) 'сортируем массив магазинов по цене
    Print Purchase(Shop(), NeedProd, Check1.Value = Checked)
    Call StatShop(Shop())
End Sub
 
'процедура сортировки магазинов по возрастанию цены
Private Sub SortMinPrice(ByRef S() As typeShop)
    Dim i As Integer, j As Integer, temp As Single, t As typeShop
    For i = 1 To UBound(S)
       temp = S(i).Price
       For j = i To UBound(S) - 1
           If temp > S(j + 1).Price Then
               t = S(j + 1)
               S(j + 1) = S(j)
               S(j) = t
           End If
       Next j
    Next i
End Sub
 
'процедура выводит на форму сведения о наличии товара в магазинах
Private Sub StatShop(ByRef S() As typeShop)
    Dim i As Integer
    Print
    Print "Наличие товара в магазинах : " & vbCrLf;
    For i = 1 To UBound(S)
         Print "Магазин № "; S(i).Number & "  Цена "; S(i).Price & "  Количество товара " & S(i).Count
    Next i
    Print
End Sub
 
Private Function Purchase(ByRef S() As typeShop, ByVal NeedProduct As Integer, Optional ByVal OptimalPurchase As Boolean = False) As String
    Dim St As String, i As Integer, j As Integer
      If OptimalPurchase = False Then
          'идём во все магазины, начиная с первого
          For i = 1 To UBound(S)
             'Делаем покупки до тех пор, пока в магазине не кончится товар или не наберём нужное нам количество
              j = 0
              Do Until S(i).Count = 0 Or NeedProduct = 0
                      S(i).Count = S(i).Count - 1 'при каждой покупке уменьшаем количество товара в магазине на 1
                      NeedProduct = NeedProduct - 1           'при каждой покупке уменьшаем количество нужного нам товара на 1
                      j = j + 1                         'считаем количество покупок в каждом магазине
              Loop
              If j > 0 Then St = St & vbCrLf & "Покупаем  в магазине № " & S(i).Number & "  " & j & " шт."
              'если всё купили - заканчиваем походы по магазинам
              If NeedProduct = 0 Then Exit For
           Next i
           'если в магазинах кончился товар и мы не набрали нобходимого нам количества
           If NeedProduct > 0 Then St = St & vbCrLf & "В магазинах недостаточно товара"
       Else
           For i = 1 To UBound(S)
               If S(i).Count >= NeedProduct Then
                  S(i).Count = S(i).Count - NeedProduct
                  St = St & vbCrLf & "Покупаем  в магазине № " & S(i).Number & "  " & NeedProduct & " шт."
                  NeedProduct = 0
                  Exit For
               End If
            Next i
            If NeedProduct > 0 Then St = St & "Ни в одном из магазинов недостаточно товара для совершения одной покупки."
       End If
    Purchase = St
End Function
Миниатюры
Нужно рассчитать как выгодно купить товар алгоритмически   Нужно рассчитать как выгодно купить товар алгоритмически  
0
 Аватар для morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745
09.09.2013, 14:10
Может проще так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Dim Mag(4, 3) As Integer '1-é óðîâåíü - ÍîìåðÌàãàçèíà; 2-é óðîâåíü: 1 - Öåíà, 2 - Êîë-âî, 3 - ÑòàòóñÂûáîðà
Dim m$, m1$, Nado%, mincen%, nommag%
 
Private Sub Form_Load()
Me.AutoRedraw = True '-------ââîä äàííûõ
Nado = InputBox("Ñêîëüêî íàäî", "Ââîä äàííûõ", 1)
For i = 1 To 4
m = "¹" & CStr(i)
Mag(i, 1) = InputBox("Öåíà â ìàãàçèíå " + m, "Ââîä äàííûõ", 10)
m1 = "Ìàãàçèí " + m + ": Öåíà" + Str(Mag(i, 1))
If Mag(i, 1) > mincen Then mincen = Mag(i, 1) 'íàõîäèì ÌàêñèìóìÖåíû
Mag(i, 2) = InputBox("Êîë-âî â ìàãàçèíå " + m, "Ââîä äàííûõ", 1)
Mag(i, 3) = IIf(Mag(i, 2) < Nado, 0, 1) 'ïðèñâàèâàåì Ñòàòóñ
m1 = m1 + "; Êîë-âî" + Str(Mag(i, 2)) + "; Ñòàòóñ" + Str(Mag(i, 3))
Print m1
Next i
'----------- âûáîð
'mincen = Mag(1, 1): nommag = 1
mincen = mincen + 1 'çàâûøàåì Ìàêñèìóì
For i = 1 To 4
If Mag(i, 3) = 1 Then
If Mag(i, 1) < mincen Then mincen = Mag(i, 1): nommag = i
End If
Next i
'---------- âûâîä
Print "---------------"
Print "Êóïèòü â ìàãàçèíå ¹" + Str(nommag)
End Sub
2
09.09.2013, 14:20

Не по теме:

Цитата Сообщение от morgann55 Посмотреть сообщение
Может проще так:
Да у меня, вроде бы, тоже несложно ;)

0
 Аватар для morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745
09.09.2013, 14:27
Цитата Сообщение от SoftIce Посмотреть сообщение

Не по теме:


Да у меня, вроде бы, тоже несложно ;)

Да, но длиннее (и нет ввода данных - каждый новый расчёт будем начинать с редактора...)
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
09.09.2013, 14:39
Цитата Сообщение от morgann55 Посмотреть сообщение
нет ввода данных - каждый новый расчёт будем начинать с редактора...)
Мёртвого замучишь
процедура Command1_Click
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Command1_Click()
    Dim i As Integer, j As Integer, n As Integer, NeedProd As Integer  '  сколько нужно товара
    Cls
    Me.AutoRedraw = True
    n = InputBox("Количество магазинов", , 4)
    ReDim Shop(1 To n) As typeShop
    For i = 1 To n
        Shop(i).Number = i
        Shop(i).Count = InputBox("Количество товара в магазине № " & i, , 3)
        Shop(i).Price = InputBox("Cтоимость товара в магазине № " & i, , 30)
    Next i
    Call StatShop(Shop())
    NeedProd = InputBox("Сколько нужно товара?", "Ввод данных", 5)
    Print "Необходимое количество товара  " & NeedProd
    Call SortMinPrice(Shop()) 'сортируем массив магазинов по цене
    Print Purchase(Shop(), NeedProd, Check1.Value = Checked)
    Call StatShop(Shop())
End Sub
Добавлено через 4 минуты
morgann55, а у тебя количество магазинов фиксировано
2
 Аватар для morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745
09.09.2013, 14:41
SoftIce, Я тебе репутацию за ЭТО и повысил
0
09.09.2013, 14:47

Не по теме:

Спасибо, мне именно одного балла и не хватало для полного счастья :D

0
 Аватар для morgann55
1365 / 207 / 37
Регистрация: 09.02.2012
Сообщений: 745
09.09.2013, 15:03
Цитата Сообщение от SoftIce Посмотреть сообщение

Не по теме:

Спасибо, мне именно одного балла и не хватало для полного счастья :D

Вот смотри - Чиновники не дают оценить коллег по Достоинству !!!!
(А будто я ЕГО тебе повышал)
Миниатюры
Нужно рассчитать как выгодно купить товар алгоритмически  
0
207 / 23 / 6
Регистрация: 12.06.2012
Сообщений: 235
09.09.2013, 23:03  [ТС]
Простите, не было возможности выйти раньше и протестировать.
Сейчас самое время, чтобы начать проверки.
Отпишу о результатах вскоре! Спасибо за содействие, очень требовалось стороннее вмешательство.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
09.09.2013, 23:07
Если будете использовать мой код, то вот небольшая поправка к процедуре сортировки:

Процедура должна выглядеть так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
'процедура сортировки магазинов по возрастанию цены
Private Sub SortMinPrice(ByRef S() As typeShop)
    Dim i As Integer, j As Integer, t As typeShop
    For i = 1 To UBound(S)
        For j = 1 To UBound(S) - 1
           If S(j).Price > S(j + 1).Price Then
               t = S(j + 1)
               S(j + 1) = S(j)
               S(j) = t
           End If
       Next j
    Next i
End Sub
1
207 / 23 / 6
Регистрация: 12.06.2012
Сообщений: 235
11.09.2013, 03:02  [ТС]
SoftIceДа, конечно буду использовать, огромное спасибо.
Я просто пока думаю, как красиво уйти от пользовательских типов.
Изначально, в коде уже присутствует набитый массив с данными о номере магазина, кол-ве, и цене.
Заменить просто так не могу, придётся править много форм.
А в процедуре сортировки как раз необходимо переставление.

Ну т.е. я говорю про это:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub SortMinPrice(ByRef S() As typeShop)
    Dim i As Integer, j As Integer, t As typeShop
    For i = 1 To UBound(S)
        For j = 1 To UBound(S) - 1
           If S(j).Price > S(j + 1).Price Then
               t = S(j + 1)
               S(j + 1) = S(j)
               S(j) = t
           End If
       Next j
    Next i
End Sub
заменить просто на сортировку массива?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2013, 03:02
Помогаю со студенческими работами здесь

Купить товар без цены
Всем привет. Столкнулся с необходимостью сделать так, чтобы покупатель мог оформить заказ на товар, который не имеет цены. Если товар...

Рассчитать скидку на товар
день добрый, дали задачу выполнить задачу) не знаю как правильно начать писать код, подскажите или напишите полностью вот такую штуку...

У вас есть 100р, вам нужно купить 100 голов скота Программа определяет сколько купить быков, коров и телят
2) У вас есть 100р, вам нужно купить 100 голов скота. Бык-10р, корова-5р, теленок-50 коп. Нельзя купить только быков, или только коров....

Рассчитать сумму скидки на товар, купленный на мелкооптовом складе
Помогите пожалуйста сделать)))

Как научиться думать алгоритмически?
Собственно задался вопросом,у меня по сути с математикой проблем в пределах школы\шараги не было.Сейчас учусь в институте, программирование...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru