Форум программистов, компьютерный форум, киберфорум
Ruby
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
8 / 6 / 2
Регистрация: 29.11.2017
Сообщений: 206

Опишите класс CoffeeMachine, моделирующий работу кофейного аппарата.

26.11.2018, 19:49. Показов 2329. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В кофейном аппарате 6 емкостей: для кофе, чая, какао, сливок, лимона и сахара. Объем каждой емкости задается порциями. Максимальный объем каждой емкости рассчитан на одинаковое количество порций.

Аппарат может готовить напитки по заданному набору рецептов. Рецепт представляет собой набор ингредиентов из имеющихся, с указанием количества порций каждого из них. Пользователь аппарата может при желании в заказе увеличить или уменьшить количество каждого из ингредиентов рецепта на одну порцию, добавить одну порцию лимона (если лимон не входит в рецепт) и добавить от одной до девяти порций сахара. Аппарат готовит напиток, только если все заказанные ингредиенты есть в наличии.

Опишите класс CoffeeMachine, моделирующий работу кофейного аппарата.

В классе должен быть описан хеш-константа Recipes, содержащий рецепты напитков для автоматов данного класса, и константа — объем емкостей для аппаратов данного класса. Ключом в Recipes является строка — название напитка, а каждым значением — хеш с названиями и количеством ингредиентов. Названия ингредиентов, используемые в программе — строки "coffee", "tea", "chocolate", "cream", "lemon", "sugar". Количество порций в каждом рецепте — целое число.

Должны быть определены следующие методы:
  • load — заполнить на 100% все емкости аппарата. Результат — загруженный аппарат.
  • order(rec, changes) — заказать напиток, где rec — строка, наименование рецепта, а changes — хеш, содержащий необходимые изменения в рецепте. Для любого изменения задается целое число — количество порций, которое нужно увеличить или уменьшить вхождение ингредиента в рецепт. Если указанный ингредиент отсутствует в рецепте (за исключением сахара и лимона), то он игнорируется. Если для ингредиента, отличного от сахара, указано изменение больше 1, то оно принимается равным 1 (для сахара величина не может быть больше 9, в противном случае принимается 9). Если для ингредиента указано изменение меньше чем -1, то оно принимается равным -1. Метод должен изменять состояние аппарата и выдавать true, если напиток успешно приготовлен или nil, если напиток приготовить нельзя.
  • status — определить состояние аппарата. Метод должен возвращать хеш, описывающий оставшиеся ингредиенты.
  • stat — выдать статистику со времени последней загрузки аппарата. Метод должен возвращать хеш, описывающий количество заказов по каждому рецепту после последней заправки аппарата ингредиентами (для рецептов, по которым были заказы).
Мой код:
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CoffeeMachine 
def initialize(hs = {}) 
@Recipes = {} # хеш рецептов 
@Ingridients = {} # хеш ингридиентов 
load 
end 
 
Ingridients = ["coffee", "tea", "chocolate", "cream", "lemon", "sugar"] 
Recipes = {"tea + lemon" => ("tea" => 3 "lemon" => 1)} 
Value = 25 
 
def load 
Ingridients.each {|i| @ingred[i] = Value} 
end 
 
def order (rec, changes) 
if Recipes[rec].nil? then return nil end 
rec_copy = Recipes[rec].dup 
if rec_copy["lemon"] nil? then rec_copy["lemon"] = 0 end 
if rec_copy["sugar"] nil? then rec_copy["sugar"] = 0 end
Подскажите,как дальше сделать(
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2018, 19:49
Ответы с готовыми решениями:

Реализовать класс, моделирующий работу N-местной автостоянки
Пожалуйста помогите с этими заданиями. Коллекции (10) 3) Реализовать класс, моделирующий работу N-местной автостоянки. Машина...

Реализовать класс Bankomat моделирующий работу банкомата.
Реализовать класс Bankomat моделирующий работу банкомата. В классе должны содержатся поля для хранения идентификационного номера банкомата,...

Реализовать класс Bankomat, моделирующий работу банкомата
Ребят беда, такая интересная задачка попалась мне, вроде ничего особенного но посмотрев глубже показалось очень тяжкой, половина реализаций...

2
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
30.11.2018, 21:40
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
module CoffeeShop
  class Recipe
    APPLICABLE = %w[lemon sugar].freeze
    MAX_VALUE = {
      'sugar' => 9
    }.freeze
 
    attr_reader :name, :ingredients
 
    def prepare(name, ingredients, changes = {})
      @name = name
      @ingredients = ingredients.dup
      change(changes)
    end
 
    def change(new_values)
      new_values.each do |k, v|
        next unless APPLICABLE.include?(k) || ingredients.key?(k)
 
        value = ingredients.fetch(k, 0) + normalize_value(k, v)
        ingredients[k] = value < 0 ? 0 : value
      end
    end
 
    private
 
    def normalize_value(ingredient, value)
      if value < 0
        -1
      else
        max = MAX_VALUE[ingredient] || 1
        value > max ? max : value
      end
    end
  end
 
  class CoffeeMachine
    INGREDIENTS = %w[coffee tea chocolate cream lemon sugar].freeze
    MAX_VOLUME = 50
 
    RECIPES = {
      'tea' => {
        'tea' => 1,
        'sugar' => 2
      },
      'coffee' => {
        'coffee' => 1,
        'cream' => 1,
        'sugar' => 1
      }
    }.freeze
 
    attr_reader :status, :stat
 
    def initialize(recipe = Recipe.new)
      @recipe = recipe
      load
    end
 
    def load
      @stat = Hash.new(0)
      @status = Hash[INGREDIENTS.map { |i| [i, MAX_VOLUME] }]
    end
 
    def order(recipe_name, changes = {})
      ingredients = RECIPES[recipe_name]
      return nil if ingredients.nil?
 
      @recipe.prepare(recipe_name, ingredients, changes)
      make
    end
 
    private
 
    def make
      return nil unless available?
 
      use_ingredients
      write_to_stat
 
      true
    end
 
    def available?
      @recipe.ingredients.all? do |ingredient, value|
        status.fetch(ingredient) - value >= 0
      end
    end
 
    def use_ingredients
      @recipe.ingredients.each do |ingredient, value|
        status[ingredient] -= value
      end
    end
 
    def write_to_stat
      stat[@recipe.name] += 1
    end
  end
end
RSpec

recipe_spec.rb
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
require 'coffee_shop'
 
RSpec.describe CoffeeShop::Recipe do
  let :recipes do
    {
      'tea with cream' => {
        'tea' => 1,
        'cream' => 1
      }
    }
  end
 
  before(:each) { subject.prepare('test recipe', recipes['tea with cream']) }
 
  describe '#initialize' do
    it 'should store ingredients' do
      expect(subject.ingredients).to eq recipes['tea with cream']
    end
  end
 
  describe '#change' do
    it 'should not change original recipe' do
      subject.change('cream' => 2)
      expect(recipes['tea with cream']).to eq({'tea' => 1, 'cream' => 1})
    end
 
    describe 'ingredients in recipe list' do
      describe 'increase' do
        it 'should increase by 1 point' do
          subject.change('cream' => 2)
          expect(subject.ingredients).to eq({'tea' => 1, 'cream' => 2})
        end
      end
 
      describe 'decrease' do
        it 'should decrease by 1 point' do
          subject.change('cream' => -5)
          expect(subject.ingredients).to eq({'tea' => 1, 'cream' => 0})
        end
 
        it 'should not be less than zero' do
          subject.change('cream' => -1)
          subject.change('cream' => -1)
          expect(subject.ingredients).to eq({'tea' => 1, 'cream' => 0})
        end
      end
    end
 
    describe 'sugar & lemon' do
      describe 'should allow to add sugar & lemon to recipe list' do
        it 'increase lemon by 1 point' do
          subject.change('lemon' => 5)
          expect(subject.ingredients).to eq recipes['tea with cream'].merge('lemon' => 1)
        end
 
        it 'increase sugar up to 9 points' do
          subject.change('sugar' => 5)
          expect(subject.ingredients).to eq recipes['tea with cream'].merge('sugar' => 5)
        end
      end
    end
 
    describe 'ingredients not in recipe list' do
      it 'should ignore increasing ingredients' do
        subject.change('mint' => 1)
        expect(subject.ingredients).to eq(recipes['tea with cream'])
      end
    end
  end
end
machine_spec.rb
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
require 'coffee_shop'
 
RSpec.describe CoffeeShop::CoffeeMachine do
  describe '#load' do
    before :each do
      subject.order('tea')
      subject.load
    end
 
    it 'load ingredients to max value' do
      expect(subject.status.values).to all(eq described_class::MAX_VOLUME)
    end
 
    it 'reset stat to empty hash' do
      expect(subject.stat).to eq({})
    end
  end
 
  describe '#order' do
    describe 'invalid recipe' do
      it 'should return nil' do
        expect(subject.order('recipe not in the list')).to be_nil
      end
    end
 
    describe 'valid recipe' do
      let(:recipe_name) { 'tea' }
 
      it 'should return true' do
        expect(subject.order(recipe_name)).to be_truthy
      end
 
      describe 'should change machine' do
        it 'write order name to stat' do
          subject.order(recipe_name)
          expect(subject.stat).to eq({'tea' => 1})
        end
 
        it 'decrease count of available ingredients' do
          changes = {'tea' => 1, 'sugar' => -2, 'lemon' => 5, 'cream' => 1}
          subject.order(recipe_name, changes)
          status = subject.status
 
          expect(status['tea']).to eq(48)
          expect(status['sugar']).to eq(49)
          expect(status['lemon']).to eq(49)
          expect(status['cream']).to eq(50)
        end
      end
 
      describe 'with not enough ingredients' do
        before :each do
          25.times { subject.order(recipe_name) }
        end
 
        it 'sugar must be zero' do
          expect(subject.status['sugar']).to be_zero
        end
 
        it 'should return nil' do
          expect(subject.order('coffee')).to be_nil
        end
      end
    end
  end
end
0
8 / 6 / 2
Регистрация: 29.11.2017
Сообщений: 206
07.12.2018, 19:01  [ТС]
Спасибо,очень помогло)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2018, 19:01
Помогаю со студенческими работами здесь

Реализовать класс Bankomat, моделирующий работу банкомата
Вот задание.Надо написать для Украины (тоесть номиналы) Перепечатайте задание на форум

Реализовать класс Bankomat, моделирующий работу банкомата
Задание: Реализовать класс Bankomat, моделирующий работу банкомата. В классе долж¬ ны содержаться поля для хранения...

Реализовать класс, моделирующий работу N-местной автостоянки
Помогите,пожалуйста!!! Реализовать класс, моделирующий работу N-местной автостоянки. Машина подъезжает к определенному месту и едет...

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

Создать собственный класс MTimer, моделирующий работу системного таймера
Создание собственного класса MTimer В задании нужно создать собственный класс, моделирующий работу системного таймера. Класс имеет...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru