红宝石 - 如何计算购物清单中物品的小计

问题描述:

我想创建一个程序,其中用户基本上“创建”一个用户输入物品和价格直至他们想要退出的购物清单。如果用户输入'q'或'Q',那么程序应该停止提示用户,而应该计算小计,添加额定6%的销售税,并显示总结果。红宝石 - 如何计算购物清单中物品的小计

我得到了第一部分,用户输入他们的物品和价格,但我不知道如何让它告诉我小计,并给他们一张收据。我一直在尝试7个小时!当我运行它,它应该说:

Enter an item and its price, or ’Q/q’ to quit: eggs 2.13 
Enter an item and its price, or ’Q/q’ to quit: milk 1.26 
Enter an item and its price, or ’Q/q’ to quit: batteries 3.14 
Enter an item and its price, or ’Q/q’ to quit: q 
Receipt: 
-------- 
eggs => $2.13 
milk => $1.26 
batteries => $3.14 
--------- 
subtotal: $6.53 
tax: $0.39 
total: $6.92 

这里是我做的代码:(任何人都可以请帮我吗?)

def create_list 
puts 'Please enter item and its price or type "quit" to exit' 
items = gets.chomp.split(' ') 
grocery_list = {} 
index = 0 
until index == items.length 
grocery_list[items[index]] = 1 
index += 1 
end 
grocery_list 
end 

def add_item (list) 
items = '' 
until items == 'quit' 
puts "Enter a new item & amount, or type 'quit'." 
items = gets.chomp 
if items != 'quit' 
    new_item = items.split(' ') 
    if new_item.length > 2 
    #store int, delete, combine array, set to list w/ stored int 
    qty = new_item[-1] 
    new_item.delete_at(-1) 
    new_item.join(' ') 
    p new_item 
    end 
    list[new_item[0]] = new_item[-1] 
else 
    break 
end 
end 
list 
end 

add_item(create_list) 

puts "Receipt: " 
puts "------------" 

不知道你需要为这个哈希,他们用于存储键值对。 另外,您应该在您定义变量的地方组织您的代码,然后组织您的方法,然后运行您的代码。保持方法简单。

#define instance variabes so they can be called inside methods 
@grocery_list = [] # use array for simple grouping. hash not needed here 
@quit = false # use boolean values to trigger when to stop things. 
@done_shopping = false 
@line = "------------" # defined to not repeat ourselves (DRY) 

#define methods using single responsibility principle. 
def add_item 
    puts 'Please enter item and its price or type "quit" to exit' 
    item = gets.chomp 
    if item == 'quit' 
    @done_shopping = true 
    else 
    @grocery_list << item.split(' ') 
    end 
end 

# to always use 2 decimal places 
def format_number(float) 
    '%.2f' % float.round(2) 
end 

#just loop until we're done shopping. 
until @done_shopping 
    add_item 
end 

puts "\n" 
#print receipt header 
puts "Receipt: " 
puts @line 

#now loop over the list to output the items in arrray. 
@grocery_list.each do |item| 
    puts "#{item[0]} => $#{item[1]}" 
end 

puts @line 
# do the math 
@subtotal = @grocery_list.map{|i| i[1].to_f}.inject(&:+) #.to_f converts to float 
@tax = @subtotal * 0.825 
@total = @subtotal + @tax 

#print the totals 
puts "subtotal: $#{format_number @subtotal}" 
puts "tax: $#{format_number @tax}" 
puts "total: $#{format_number @total}" 
#close receipt 
puts @line