Object subclass: #'商品' instanceVariableNames: 'ID 製品名 価格' classVariableNames: '' poolDictionaries: '' category: 'TDDBC東京1.5-自動販売機'!]lang[(19 2 30 3 1 2 65 2 4 5 1)0,5,0,5,0,5,0,5,0,5,0! !商品 methodsFor: 'accessing'!]lang[(2 24)5,0! ID ^ ID! ! !商品 methodsFor: 'accessing'!]lang[(2 24)5,0! ID: anInteger ID := anInteger! ! !商品 methodsFor: 'accessing'!]lang[(2 24)5,0! 価格 ^ 価格!]lang[(2 4 2)5,0,5! ! !商品 methodsFor: 'accessing'!]lang[(2 24)5,0! 価格: anInteger 価格 := anInteger!]lang[(2 13 2 13)5,0,5,0! ! !商品 methodsFor: 'accessing'!]lang[(2 24)5,0! 製品名 ^ 製品名!]lang[(3 4 3)5,0,5! ! !商品 methodsFor: 'accessing'!]lang[(2 24)5,0! 製品名: anSymbol 製品名 := anSymbol!]lang[(3 12 3 12)5,0,5,0! ! !商品 methodsFor: 'printing'!]lang[(2 23)5,0! printOn: stream stream nextPutAll: 製品名 printString!]lang[(36 3 12)0,5,0! ! !商品 methodsFor: 'testing'!]lang[(2 22)5,0! = a商品 a商品 class == self class ifFalse: [^false]. a商品 ID = ID ifFalse: [^false]. a商品 製品名 = 製品名 ifFalse: [^false]. a商品 価格 = 価格 ifFalse: [^false]. ^true!]lang[(3 2 3 2 42 2 30 2 1 3 3 3 22 2 1 2 3 2 26)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !商品 methodsFor: 'testing'!]lang[(2 22)5,0! hash ^(ID hash bitXor: 製品名 hash) bitXor: 価格 hash!]lang[(24 3 15 2 5)0,5,0,5,0! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! 商品 class instanceVariableNames: ''!]lang[(2 33)5,0! !商品 class methodsFor: 'instance creation'!]lang[(2 38)5,0! ID: ID 製品名: 製品名 価格: 価格 ^self new ID: ID; 製品名: 製品名; 価格: 価格; yourself!]lang[(7 3 2 3 1 2 2 2 21 3 2 3 2 2 2 2 10)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! Object subclass: #'自動販売機' instanceVariableNames: '投入金額 在庫 売上金額 保持紙幣と硬貨' classVariableNames: '' poolDictionaries: '' category: 'TDDBC東京1.5-自動販売機'!]lang[(19 5 27 4 1 2 1 4 1 7 65 2 4 5 1)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! !自動販売機 methodsFor: 'inserting'!]lang[(5 24)5,0! 投入: 紙幣か硬貨 (self 使用可能紙幣と硬貨 includes: 紙幣か硬貨) ifFalse: [self error: 'この紙幣または硬貨は使えません']. 投入金額 := 投入金額 + 紙幣か硬貨. 保持紙幣と硬貨 at: 紙幣か硬貨 put: (保持紙幣と硬貨 at: 紙幣か硬貨) + 1!]lang[(2 2 5 8 9 11 5 25 15 5 4 4 4 3 5 3 7 5 5 7 7 5 5 5)5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機 methodsFor: 'accessing'!]lang[(5 24)5,0! 使用可能紙幣と硬貨 ^保持紙幣と硬貨 keys asSet!]lang[(9 3 7 11)5,0,5,0! ! !自動販売機 methodsFor: 'accessing'!]lang[(5 24)5,0! 保持紙幣と硬貨 ^保持紙幣と硬貨!]lang[(7 3 7)5,0,5! ! !自動販売機 methodsFor: 'accessing'!]lang[(5 24)5,0! 在庫 ^在庫!]lang[(2 3 2)5,0,5! ! !自動販売機 methodsFor: 'accessing'!]lang[(5 24)5,0! 在庫切れ商品群 ^在庫 keys select: [:key | (在庫 at: key) = 0] thenCollect: [:key | key ID]!]lang[(7 3 2 23 2 43)5,0,5,0,5,0! ! !自動販売機 methodsFor: 'accessing'!]lang[(5 24)5,0! 売上金額 ^売上金額!]lang[(4 3 4)5,0,5! ! !自動販売機 methodsFor: 'accessing'!]lang[(5 24)5,0! 投入金額 ^投入金額!]lang[(4 3 4)5,0,5! ! !自動販売機 methodsFor: 'accessing'!]lang[(5 24)5,0! 購入可能商品群 ^在庫 keys select: [:key | (在庫 at: key) > 0 and: [key 価格 <= 投入金額] and: [self 購入後残金返却可か: key 価格]] thenCollect: [:key | key ID]!]lang[(7 3 2 28 2 28 2 4 4 17 9 6 2 33)5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機 methodsFor: 'initialization'!]lang[(5 29)5,0! initialize super initialize. 投入金額 := 売上金額 := 0. 在庫 := Dictionary new. 保持紙幣と硬貨 := {1000->5. 500->10. 100->10. 50->10. 10->10} as: Dictionary. 5 timesRepeat: [self 補充: (商品 ID: 1 製品名: #コーラ 価格: 120)]. 5 timesRepeat: [self 補充: (商品 ID: 2 製品名: #レッドブル 価格: 200)]. 5 timesRepeat: [self 補充: (商品 ID: 3 製品名: #水 価格: 100)] !]lang[(31 4 4 4 8 2 21 7 86 2 3 2 7 3 3 3 1 2 31 2 3 2 7 3 3 5 1 2 31 2 3 2 7 3 3 1 1 2 8)0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機 methodsFor: 'purchasing'!]lang[(5 25)5,0! 購入: 商品ID | 購入可能商品群 購入商品 | 購入可能商品群 := self 購入可能商品群. (購入可能商品群 includes: 商品ID) ifFalse: [self error: '購入できません']. 購入商品 := 在庫 keys detect: [:each | each ID = 商品ID]. 在庫 at: 購入商品 put: (在庫 at: 購入商品) - 1. 売上金額 := 売上金額 + 購入商品 価格. 投入金額 := 投入金額 - 購入商品 価格. self 差額返却 !]lang[(2 2 2 6 7 1 4 4 7 9 7 4 7 11 2 27 7 5 4 4 2 33 2 6 2 5 4 7 2 5 4 8 4 4 4 3 4 1 2 3 4 4 4 3 4 1 2 8 4 1)5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機 methodsFor: 'adding'!]lang[(5 21)5,0! 補充: a商品 ^在庫 at: a商品 put: (在庫 at: a商品 ifAbsentPut: [0]) + 1!]lang[(2 3 2 4 2 6 2 7 2 6 2 22)5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機 methodsFor: 'calculation'!]lang[(5 26)5,0! 差額返却 保持紙幣と硬貨 keys sort reverseDo: [:key | [key <= 投入金額] whileTrue: [ 投入金額 := 投入金額 - key. 保持紙幣と硬貨 at: key put: (保持紙幣と硬貨 at: key) - 1]]!]lang[(4 2 7 40 4 18 4 4 4 11 7 15 7 15)5,0,5,0,5,0,5,0,5,0,5,0,5,0! ! !自動販売機 methodsFor: 'testing'!]lang[(5 22)5,0! 購入後残金返却可か: 購入金額 | 返却額 現状 | 返却額 := 投入金額 - 購入金額. 現状 := 保持紙幣と硬貨 copy. 現状 keys sort reverseDo: [:key | [key <= 返却額 and: [(現状 at: key) > 0]] whileTrue: [ 返却額 := 返却額 - key. 現状 at: key put: (現状 at: key) - 1]]. ^返却額 = 0!]lang[(9 2 4 4 3 1 2 4 3 4 4 3 4 3 2 4 7 8 2 40 3 8 2 32 3 4 3 11 2 15 2 19 3 4)5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0! !