Форум программистов, компьютерный форум, киберфорум
Ruby
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 26.07.2012
Сообщений: 11

Симуляция обработки заказов

31.08.2012, 22:40. Показов 937. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, и снова прошу Вас о помощи)) есть задание по проверке заказов: грубо говоря, имеем список товаров с атрибутами: товарный код, наименование товара, цена и количество на складе, и список заказов с атрибутами: номер заказа, код товара и количество. Нужно сделать симуляцию продажи заказанного товара и посчитать доход - отдельно за ноутбуки и отдельно за все остальное. Теоретически задание на практику с регулярными выражениями и исключениями. Я написала код, но опять же не понимаю в чем ошибка:

Ruby
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
product_data = [
  "PE316,Zvukotesna vlozka SPIRE pro redukci hluku,104,51",
  "RI080,FAN COOLER PASIVNI,491,88",
  "QE091,Nabijecka PENTAGRAM Pocket USB,608,30",
  "QU286,RAMECEK ViPower VYMENNY PLAST ATA,572,95",
  "PU441,RAZER LYCOSA Gaming Keyboard,160,56",
  "QE170,ICON,136,47",
  "SE125,UTP OCHRANA KONEKTORU,310,17",
  "TI390,PCI Express,415,56",
  "TO120,PRINTSERVER Digitus Fast Ethernet USB,674,38",
  "QO071,230V Belkin Powerline Turbo Networking adapter,796,81",
  "QO350,WIFI ANTENA smerova parabolicka,585,88",
  "QE042,WIFI ANTENA smerova,398,81",
  "RU090,TP-LINK router TL-R,646,92",
  "SE447,ADSL WELL PC,155,-1000", #неправильное количество товара на складе
  "PI287,VoIP Perfect GW,-999,23", #неправильная цена
  "QA255,STOJANEK POD MONITOR cerny se zasuvkou,277,90",
  "SE433,Brasna ultracase pro Notebook 15,425,80",
  "SA309,BATOH pro Notebook BacPac Easy DICOTA,511,52",
  "XX449,LOGO SAFE obal na Notebook neopren pro,328,80", #неправильный товарный код
  "TI185,PORTE Blue Laser samolepici folie pro NTB,383,56",
  "TO280,PORTE Yellow Cosmo samolepici folie pro NTB,506,97",
  "RI443,Evolve sportovni hodinky SPORT,682,17",
  "PO040,PCMCIA SERIOVY PORT STLabs,584,10",
  "TU116,Notebook HP EliteBook 8730w,142,11",
  "QO408,Notebook ASUS Lamborghini VX5-6X002J,23441,12",
  "RA222,Notebook LENOVO THINKPAD W700,34587,98",
  "RI407,Notebook TOSHIBA Qosmio X300-15G,35890,25",
  "PI422,Notebook SONY VAIO Z41XD/B/ C2D P9700,45691,75",
  "PE217,Notebook APPLE MacBook Pro,55165,25",
  "QI168,Notebook UMAX VisionBook,18230,56",
  "SO999,Notebook HP EliteBook 8730w,20741,98" #неправильный товарный код
]
 
order_data = [
  "1,PE316,-100", #неправильное количество товара
  "2,RI080,40",
  "3,QE091,45",
  "4,QU286,62",
  "5,PU441,8",
  "6,QE170,40",
  "7,SE125,34",
  "8,TI390,52",
  "9,TO120,2",
  "10,QO071,15",
  "11,QO350,32",
  "12,QE042,38",
  "13,RU090,54",
  "14,SE447,52",
  "15,PI287,70",
  "16,QA255,54",
  "17,SE433,20",
  "18,SA309,66",
  "19,XX449,57", #неправильный товарный код
  "20,TI185,54",
  "21,TO280,69",
  "22,RI443,13",
  "23,PO040,55",
  "24,TU116,67",
  "25,QO408,7",
  "26,RA222,32",
  "27,RI407,18",
  "28,PI422,35",
  "29,PE217,31",
  "30,QI168,1",
  "31,SO999,54", #неправильный товарный код
  "32,PA001,54"  #несуществующий товар
]
 
class Product
  attr_reader :code, :name, :price, :instore, :sold
  # проверяет данные, вызывает исключения в случае ошибки
  def initialize(code, name, price, instore)
    @code = code
    @name = name
    @price = price
    @instore = instore
    @sold = 0
    # дополните контроль правильности данных
    # в случае ошибки вызовите исключение
    raise "Wrong product code" if not @code =~ /^{P|Q|R|S|T}{A|E|I|O|U}{00[1-9]|[1-3][0-9]0|[0-3][1-9]0|[1-3][1-9]0|[0-3][0-9][1-9]|4[0-4][0-9]|450}$/
    #товарный код должен быть: первая буква - P|Q|R|S|T, вторая - A|E|I|O|U а потом число от 001 до 450 (по-моему я тут немного переборщила)
    raise "Wrong instore" if @instore <= 0
    raise "Wrong price" if @price <= 0
  end
  #и цена товара и его количество на складе >= 0
  
  # метод - покупка, проверяет количество товара на складе, и если его достаточно,
  # то приплюсует множество запрашиваемого товара к переменной sold. 
  #  в противном случае вызовет ошибку.
  def buy(amount)
   # имплеметируйте метод
   if amount <= @instore
     @instore -= amount
     @sold += amount
     return @sold
   else
     raise "Not enough items in store"
   end
 
  end
end
 
class Order
  attr_reader :number, :code, :amount
  # проверяет данные, вызывает исключения  в случае ошибки
  def initialize(number, code, amount)
    @number = number
    @code = code
    @amount = amount
     # дополните контроль правильности данных
    #  в случае ошибки вызовите исключение
    raise "Wrong product code in order" if not @code =~ /^{P|Q|R|S|T}{A|E|I|O|U}{00[1-9]|[1-3][0-9]0|[0-3][1-9]0|[1-3][1-9]0|[0-3][0-9][1-9]|4[0-4][0-9]|450}$/
    raise "Wrong amount to buy" if @amount <= 0
  end
end
 
class Store
  attr_reader :products, :orders, :profit_notebooks, :profit_other
  def initialize(product_data, order_data)
    @products = []
    @orders = []
 
    product_data.each do |prod|
      data = prod.split(",")
      begin
      product_object = Product.new(data[0],data[1],data[2].to_i,data[3].to_i)
      rescue Exception => e
        puts "#{product_object.code} #{e}"
      end
   # здесь идет перехват ошибок
      @products << product_object
      
    end
 
    order_data.each do |order|
      data = order.split(",")
       begin
      order_object = Order.new(data[0].to_i,data[1],data[2].to_i)
     rescue Exception => e
       puts "#{order.code}: #{e}"
     
      end
      @orders << order_object
      
    end
  end
 
  # Преречислит заказы - попробует найти товар на складе методом find_product
  # и купить методом buy
  # фикcирует ошибки, если товара нет на складе или он не существует
  def process_orders
    @orders.each do |i|
      begin
      i.find_product(i.code)
      @finded_product.buy(i.amount)
      rescue Exception => e
        puts "Cancelling order #{i.number} - #{i.code}: #{e}"
      end
    end
  end
 
  # посчитает доход и сохранит в переменные @profit_notebooks и @profit_other
  # за ноутбук берется любой товар, имя которого начинается с "Notebook"
  def calculate_profit
    @profit_notebooks = 0
    @profit_other = 0
    @products.each do |i|
      profit = i.sold * i.price
      if i.name =~ /^Notebook.*$/
        @profit_notebooks += profit
      else
        @profit_other += profit
      end
    end
    puts "Profit on notebooks: #{store.profit_notebooks}"
    puts "Profit on other: #{store.profit_other}"
  end
 
  private
 
  # Найдет продукт из заказов в товарах на складе или вызовет исключение
  def find_product(code)
    @finded_product = @products.find{|u| u.code == code}
    if @finded_product
      return @finded_product
    else
      raise "Product not found"
    end
  end
end
 
store = Store.new(product_data, order_data)
store.process_orders
store.calculate_profit
Результат, по идее, должен быть таким:

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SE447 Wrong instore
PI287 Wrong price
XX449 Wrong product code
SO999 Wrong product code
PE316: Wrong amount to buy
XX449: Wrong product code in order
SO999: Wrong product code in order
Cancelling order 3 - QE091: Not enough items in store
Cancelling order 7 - SE125: Not enough items in store
Cancelling order 14 - SE447: Product not found
Cancelling order 15 - PI287: Product not found
Cancelling order 18 - SA309: Not enough items in store
Cancelling order 23 - PO040: Not enough items in store
Cancelling order 24 - TU116: Not enough items in store
Cancelling order 29 - PE217: Not enough items in store
Cancelling order 32 - PA001: Product not found
Profit on notebooks: 3534306
Profit on other items: 253340
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2012, 22:40
Ответы с готовыми решениями:

Система обработки заказов
Всем привет. Разрабатываю систему обработки заказов. Есть 2 пользовательских страницы 1 где делается заказ (с нее данные идут в БД, н-р:...

Страница с формами редактирования заказов + постраничный вывод = пустышки, если кол. заказов < заказов на стр.
Добрый день. Есть у меня страничка обновления заказов с вот таким кодом &lt;? /* Соединяемся с базой данных */ /* Таблица...

Плагин для обработки заказов
Где можно взять плагин для обработки заказов. Поясню: Я хочу чтобы у меня на сайте на отдельной странице была форма заказа состоящвая из...

2
0 / 0 / 0
Регистрация: 26.07.2012
Сообщений: 11
02.09.2012, 09:32  [ТС]
Ох, ну подскажите пожалуйста, хоть, как сделать регулярное выражение на любое число в интервале от 001-450?
0
02.09.2012, 11:02

Не по теме:

Цитата Сообщение от lilindosss Посмотреть сообщение
как сделать регулярное выражение на любое число в интервале от 001-450?
Понятия не имею, какой диалект регулярных выражений в Ruby, но в PCRE это было бы так:
Code
1
\b(?:0(?:0[1-9]|[1-9][0-9])|[1-3][0-9]{2}|4(?:[0-4][0-9]|50))\b
\b - граница слова
(?:...) - незахватывающая группирующая скобка.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2012, 11:02
Помогаю со студенческими работами здесь

Структура БД системы обработки заказов
Уважаемые господа от электронной коммерции! Не поделитесь ли Вашими идеями относительно того, как лучше организовать структуру БД...

Форма для обработки заказов
форма для обработки заказов на PHP сайт, который я создаю размещен на локальном хосте. Форма на PHP:: &lt;?php if (isset($site))...

Автоматизация обработки заказов интернет магазина
Всем привет! Вопрос в следующем, есть интернет магазин на битриксе, есть куча поставщиков. При обработке заказов в браузере выполняется...

Разработка интерфейса обработки заказов магазинов
Здравствуйте, уважаемые форумчане! Очень сложная задача!.. для меня)) Разрабатываю в MSA 2016 приложение пользователя. ...

Количество заказов и сортировка заказов
1. Провести сортировку заказов по годам и для каждого года выявить заказчика сделавшего заказ на наибольшее количество товара. В том...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru