fork download
  1. "============================================================"
  2. " 大学図書館貸出システム"
  3. " Ideone / GNU Smalltalk用"
  4. "============================================================"
  5.  
  6.  
  7. "------------------------------------------------------------"
  8. " Bookクラス"
  9. " 図書の情報と貸出状態を管理する"
  10. "------------------------------------------------------------"
  11.  
  12. Object subclass: #Book
  13. instanceVariableNames: 'isbn title author available'
  14. classVariableNames: ''
  15. poolDictionaries: ''
  16. category: 'UniversityLibrary'!
  17.  
  18.  
  19. !Book methodsFor: 'initialization'!
  20.  
  21. initializeISBN: anISBN title: aTitle author: anAuthor
  22. isbn := anISBN.
  23. title := aTitle.
  24. author := anAuthor.
  25. available := true.
  26. ^self
  27. !
  28.  
  29. ! !
  30.  
  31.  
  32. !Book methodsFor: 'accessing'!
  33.  
  34. isbn
  35. ^isbn
  36. !
  37.  
  38. title
  39. ^title
  40. !
  41.  
  42. author
  43. ^author
  44. !
  45.  
  46. isAvailable
  47. ^available
  48. !
  49.  
  50. statusText
  51. available ifTrue: [
  52. ^'貸出可能'
  53. ].
  54.  
  55. ^'貸出中'
  56. !
  57.  
  58. ! !
  59.  
  60.  
  61. !Book methodsFor: 'loan operations'!
  62.  
  63. borrow
  64. available ifFalse: [
  65. self error: 'この図書はすでに貸出中です'
  66. ].
  67.  
  68. available := false.
  69. ^self
  70. !
  71.  
  72. returnBook
  73. available ifTrue: [
  74. self error: 'この図書は貸出されていません'
  75. ].
  76.  
  77. available := true.
  78. ^self
  79. !
  80.  
  81. ! !
  82.  
  83.  
  84. !Book methodsFor: 'printing'!
  85.  
  86. printOn: aStream
  87. aStream nextPutAll: title.
  88. aStream nextPutAll: ' / '.
  89. aStream nextPutAll: author.
  90. aStream nextPutAll: ' [ISBN: '.
  91. aStream nextPutAll: isbn.
  92. aStream nextPutAll: '] '.
  93. aStream nextPutAll: self statusText
  94. !
  95.  
  96. ! !
  97.  
  98.  
  99. "------------------------------------------------------------"
  100. " Memberクラス"
  101. " 利用者の情報と貸出条件を管理する"
  102. "------------------------------------------------------------"
  103.  
  104. Object subclass: #Member
  105. instanceVariableNames: 'memberId memberName memberType'
  106. classVariableNames: ''
  107. poolDictionaries: ''
  108. category: 'UniversityLibrary'!
  109.  
  110.  
  111. !Member methodsFor: 'initialization'!
  112.  
  113. initializeId: anId name: aName type: aType
  114. memberId := anId.
  115. memberName := aName.
  116. memberType := aType.
  117. ^self
  118. !
  119.  
  120. ! !
  121.  
  122.  
  123. !Member methodsFor: 'accessing'!
  124.  
  125. memberId
  126. ^memberId
  127. !
  128.  
  129. name
  130. ^memberName
  131. !
  132.  
  133. memberType
  134. ^memberType
  135. !
  136.  
  137. typeName
  138. memberType = #student ifTrue: [
  139. ^'学生'
  140. ].
  141.  
  142. memberType = #teacher ifTrue: [
  143. ^'教職員'
  144. ].
  145.  
  146. ^'その他'
  147. !
  148.  
  149. loanLimit
  150. memberType = #student ifTrue: [
  151. ^3
  152. ].
  153.  
  154. memberType = #teacher ifTrue: [
  155. ^10
  156. ].
  157.  
  158. ^2
  159. !
  160.  
  161. loanPeriod
  162. memberType = #teacher ifTrue: [
  163. ^30
  164. ].
  165.  
  166. ^14
  167. !
  168.  
  169. ! !
  170.  
  171.  
  172. !Member methodsFor: 'printing'!
  173.  
  174. printOn: aStream
  175. aStream nextPutAll: memberName.
  176. aStream nextPutAll: ' [利用者番号: '.
  177. aStream nextPutAll: memberId.
  178. aStream nextPutAll: ', 区分: '.
  179. aStream nextPutAll: self typeName.
  180. aStream nextPutAll: ', 貸出上限: '.
  181. aStream nextPutAll: self loanLimit printString.
  182. aStream nextPutAll: '冊]'
  183. !
  184.  
  185. ! !
  186.  
  187.  
  188. "------------------------------------------------------------"
  189. " Loanクラス"
  190. " 1件の貸出記録を管理する"
  191. " 日付は簡単にするため整数で表現する"
  192. "------------------------------------------------------------"
  193.  
  194. Object subclass: #Loan
  195. instanceVariableNames: 'loanBook loanMember loanDay dueDay returnedDay'
  196. classVariableNames: ''
  197. poolDictionaries: ''
  198. category: 'UniversityLibrary'!
  199.  
  200.  
  201. !Loan methodsFor: 'initialization'!
  202.  
  203. initializeBook: aBook member: aMember day: aDay
  204. loanBook := aBook.
  205. loanMember := aMember.
  206. loanDay := aDay.
  207. dueDay := aDay + aMember loanPeriod.
  208. returnedDay := nil.
  209. ^self
  210. !
  211.  
  212. ! !
  213.  
  214.  
  215. !Loan methodsFor: 'accessing'!
  216.  
  217. book
  218. ^loanBook
  219. !
  220.  
  221. member
  222. ^loanMember
  223. !
  224.  
  225. loanDay
  226. ^loanDay
  227. !
  228.  
  229. dueDay
  230. ^dueDay
  231. !
  232.  
  233. returnedDay
  234. ^returnedDay
  235. !
  236.  
  237. isActive
  238. ^returnedDay isNil
  239. !
  240.  
  241. ! !
  242.  
  243.  
  244. !Loan methodsFor: 'testing'!
  245.  
  246. isOverdueOn: currentDay
  247. self isActive ifFalse: [
  248. ^false
  249. ].
  250.  
  251. ^currentDay > dueDay
  252. !
  253.  
  254. overdueDaysOn: currentDay
  255. (self isOverdueOn: currentDay) ifFalse: [
  256. ^0
  257. ].
  258.  
  259. ^currentDay - dueDay
  260. !
  261.  
  262. ! !
  263.  
  264.  
  265. !Loan methodsFor: 'returning'!
  266.  
  267. returnOn: aDay
  268. self isActive ifFalse: [
  269. self error: 'この貸出記録はすでに返却済みです'
  270. ].
  271.  
  272. returnedDay := aDay.
  273. loanBook returnBook.
  274. ^self
  275. !
  276.  
  277. ! !
  278.  
  279.  
  280. !Loan methodsFor: 'printing'!
  281.  
  282. printOn: aStream
  283. aStream nextPutAll: loanMember name.
  284. aStream nextPutAll: ' が「'.
  285. aStream nextPutAll: loanBook title.
  286. aStream nextPutAll: '」を貸出'.
  287. aStream nextPutAll: ' / 貸出日: '.
  288. aStream nextPutAll: loanDay printString.
  289. aStream nextPutAll: ' / 返却期限: '.
  290. aStream nextPutAll: dueDay printString.
  291.  
  292. self isActive
  293. ifTrue: [
  294. aStream nextPutAll: ' / 貸出中'
  295. ]
  296. ifFalse: [
  297. aStream nextPutAll: ' / 返却日: '.
  298. aStream nextPutAll: returnedDay printString.
  299. aStream nextPutAll: ' / 返却済み'
  300. ]
  301. !
  302.  
  303. ! !
  304.  
  305.  
  306. "------------------------------------------------------------"
  307. " Libraryクラス"
  308. " 図書・利用者・貸出記録を管理する"
  309. "------------------------------------------------------------"
  310.  
  311. Object subclass: #Library
  312. instanceVariableNames: 'libraryName books members loans'
  313. classVariableNames: ''
  314. poolDictionaries: ''
  315. category: 'UniversityLibrary'!
  316.  
  317.  
  318. !Library methodsFor: 'initialization'!
  319.  
  320. initializeName: aName
  321. libraryName := aName.
  322. books := OrderedCollection new.
  323. members := OrderedCollection new.
  324. loans := OrderedCollection new.
  325. ^self
  326. !
  327.  
  328. ! !
  329.  
  330.  
  331. !Library methodsFor: 'accessing'!
  332.  
  333. name
  334. ^libraryName
  335. !
  336.  
  337. books
  338. ^books
  339. !
  340.  
  341. members
  342. ^members
  343. !
  344.  
  345. loans
  346. ^loans
  347. !
  348.  
  349. ! !
  350.  
  351.  
  352. !Library methodsFor: 'registration'!
  353.  
  354. addBook: aBook
  355. (self findBookByISBN: aBook isbn) notNil ifTrue: [
  356. self error: '同じISBNの図書が登録されています'
  357. ].
  358.  
  359. books add: aBook.
  360. ^aBook
  361. !
  362.  
  363. registerMember: aMember
  364. (self findMemberById: aMember memberId) notNil ifTrue: [
  365. self error: '同じ利用者番号が登録されています'
  366. ].
  367.  
  368. members add: aMember.
  369. ^aMember
  370. !
  371.  
  372. ! !
  373.  
  374.  
  375. !Library methodsFor: 'searching'!
  376.  
  377. findBookByISBN: anISBN
  378. books do: [:each |
  379. each isbn = anISBN ifTrue: [
  380. ^each
  381. ]
  382. ].
  383.  
  384. ^nil
  385. !
  386.  
  387. findMemberById: anId
  388. members do: [:each |
  389. each memberId = anId ifTrue: [
  390. ^each
  391. ]
  392. ].
  393.  
  394. ^nil
  395. !
  396.  
  397. activeLoansFor: aMember
  398. | result |
  399.  
  400. result := OrderedCollection new.
  401.  
  402. loans do: [:each |
  403. each member == aMember ifTrue: [
  404. each isActive ifTrue: [
  405. result add: each
  406. ]
  407. ]
  408. ].
  409.  
  410. ^result
  411. !
  412.  
  413. activeLoanForBook: aBook
  414. loans do: [:each |
  415. each book == aBook ifTrue: [
  416. each isActive ifTrue: [
  417. ^each
  418. ]
  419. ]
  420. ].
  421.  
  422. ^nil
  423. !
  424.  
  425. ! !
  426.  
  427.  
  428. !Library methodsFor: 'loan operations'!
  429.  
  430. lendISBN: anISBN toMember: anId onDay: aDay
  431. | targetBook targetMember currentLoans newLoan |
  432.  
  433. targetBook := self findBookByISBN: anISBN.
  434.  
  435. targetBook isNil ifTrue: [
  436. self error: '指定された図書が見つかりません'
  437. ].
  438.  
  439. targetMember := self findMemberById: anId.
  440.  
  441. targetMember isNil ifTrue: [
  442. self error: '指定された利用者が見つかりません'
  443. ].
  444.  
  445. targetBook isAvailable ifFalse: [
  446. self error: '指定された図書はすでに貸出中です'
  447. ].
  448.  
  449. currentLoans := self activeLoansFor: targetMember.
  450.  
  451. currentLoans size >= targetMember loanLimit ifTrue: [
  452. self error: '貸出可能冊数を超えています'
  453. ].
  454.  
  455. targetBook borrow.
  456.  
  457. newLoan := Loan new
  458. initializeBook: targetBook
  459. member: targetMember
  460. day: aDay.
  461.  
  462. loans add: newLoan.
  463.  
  464. ^newLoan
  465. !
  466.  
  467. returnISBN: anISBN onDay: aDay
  468. | targetBook targetLoan |
  469.  
  470. targetBook := self findBookByISBN: anISBN.
  471.  
  472. targetBook isNil ifTrue: [
  473. self error: '指定された図書が見つかりません'
  474. ].
  475.  
  476. targetLoan := self activeLoanForBook: targetBook.
  477.  
  478. targetLoan isNil ifTrue: [
  479. self error: '指定された図書は現在貸出されていません'
  480. ].
  481.  
  482. targetLoan returnOn: aDay.
  483.  
  484. ^targetLoan
  485. !
  486.  
  487. ! !
  488.  
  489.  
  490. !Library methodsFor: 'reporting'!
  491.  
  492. showBooks
  493. '' displayNl.
  494. '===== 図書一覧 =====' displayNl.
  495.  
  496. books isEmpty ifTrue: [
  497. '登録されている図書はありません' displayNl
  498. ].
  499.  
  500. books do: [:each |
  501. each displayString displayNl
  502. ]
  503. !
  504.  
  505. showMembers
  506. '' displayNl.
  507. '===== 利用者一覧 =====' displayNl.
  508.  
  509. members isEmpty ifTrue: [
  510. '登録されている利用者はいません' displayNl
  511. ].
  512.  
  513. members do: [:each |
  514. each displayString displayNl
  515. ]
  516. !
  517.  
  518. showActiveLoans
  519. | count |
  520.  
  521. count := 0.
  522.  
  523. '' displayNl.
  524. '===== 現在の貸出一覧 =====' displayNl.
  525.  
  526. loans do: [:each |
  527. each isActive ifTrue: [
  528. each displayString displayNl.
  529. count := count + 1
  530. ]
  531. ].
  532.  
  533. count = 0 ifTrue: [
  534. '現在貸出中の図書はありません' displayNl
  535. ]
  536. !
  537.  
  538. showOverdueLoansOn: currentDay
  539. | count message |
  540.  
  541. count := 0.
  542.  
  543. '' displayNl.
  544. '===== 延滞一覧 =====' displayNl.
  545.  
  546. ('確認日: ' ,
  547. currentDay printString ,
  548. '日目') displayNl.
  549.  
  550. loans do: [:each |
  551. (each isOverdueOn: currentDay) ifTrue: [
  552. message :=
  553. each displayString ,
  554. ' / 延滞日数: ' ,
  555. (each overdueDaysOn: currentDay) printString ,
  556. '日'.
  557.  
  558. message displayNl.
  559. count := count + 1
  560. ]
  561. ].
  562.  
  563. count = 0 ifTrue: [
  564. '現在延滞中の貸出はありません' displayNl
  565. ]
  566. !
  567.  
  568. showLoanHistory
  569. '' displayNl.
  570. '===== 全貸出履歴 =====' displayNl.
  571.  
  572. loans isEmpty ifTrue: [
  573. '貸出履歴はありません' displayNl
  574. ].
  575.  
  576. loans do: [:each |
  577. each displayString displayNl
  578. ]
  579. !
  580.  
  581. ! !
  582.  
  583.  
  584. "============================================================"
  585. " メインプログラム"
  586. "============================================================"
  587.  
  588. Eval [
  589. | library
  590. book1
  591. book2
  592. book3
  593. student
  594. teacher
  595. loan1
  596. loan2
  597. returnedLoan |
  598.  
  599. "図書館を生成する"
  600.  
  601. library := Library new
  602. initializeName: '○○大学図書館'.
  603.  
  604.  
  605. "図書を生成する"
  606.  
  607. book1 := Book new
  608. initializeISBN: '978-4-00-000001-1'
  609. title: 'Smalltalk入門'
  610. author: '山田太郎'.
  611.  
  612. book2 := Book new
  613. initializeISBN: '978-4-00-000002-8'
  614. title: 'オブジェクト指向設計'
  615. author: '佐藤花子'.
  616.  
  617. book3 := Book new
  618. initializeISBN: '978-4-00-000003-5'
  619. title: 'データベース基礎'
  620. author: '鈴木一郎'.
  621.  
  622.  
  623. "利用者を生成する"
  624.  
  625. student := Member new
  626. initializeId: 'S2023001'
  627. name: '田中学生'
  628. type: #student.
  629.  
  630. teacher := Member new
  631. initializeId: 'T1001'
  632. name: '佐々木教授'
  633. type: #teacher.
  634.  
  635.  
  636. "図書を登録する"
  637.  
  638. library addBook: book1.
  639. library addBook: book2.
  640. library addBook: book3.
  641.  
  642.  
  643. "利用者を登録する"
  644.  
  645. library registerMember: student.
  646. library registerMember: teacher.
  647.  
  648.  
  649. "初期状態を表示する"
  650.  
  651. '========================================' displayNl.
  652. '大学図書館貸出システムを開始します' displayNl.
  653. ('図書館名: ' , library name) displayNl.
  654. '========================================' displayNl.
  655.  
  656. library showBooks.
  657. library showMembers.
  658.  
  659.  
  660. "学生への貸出処理"
  661. "100日目に貸し出し、返却期限は114日目"
  662.  
  663. loan1 := library
  664. lendISBN: '978-4-00-000001-1'
  665. toMember: 'S2023001'
  666. onDay: 100.
  667.  
  668. '' displayNl.
  669. '===== 貸出処理結果1 =====' displayNl.
  670. loan1 displayString displayNl.
  671.  
  672.  
  673. "教職員への貸出処理"
  674. "105日目に貸し出し、返却期限は135日目"
  675.  
  676. loan2 := library
  677. lendISBN: '978-4-00-000002-8'
  678. toMember: 'T1001'
  679. onDay: 105.
  680.  
  681. '' displayNl.
  682. '===== 貸出処理結果2 =====' displayNl.
  683. loan2 displayString displayNl.
  684.  
  685.  
  686. "貸出後の状態を表示する"
  687.  
  688. library showActiveLoans.
  689. library showBooks.
  690.  
  691.  
  692. "120日目時点の延滞を確認する"
  693.  
  694. library showOverdueLoansOn: 120.
  695.  
  696.  
  697. "学生が121日目に図書を返却する"
  698.  
  699. returnedLoan := library
  700. returnISBN: '978-4-00-000001-1'
  701. onDay: 121.
  702.  
  703. '' displayNl.
  704. '===== 返却処理結果 =====' displayNl.
  705. returnedLoan displayString displayNl.
  706.  
  707.  
  708. "返却後の状態を表示する"
  709.  
  710. library showActiveLoans.
  711. library showBooks.
  712.  
  713.  
  714. "140日目時点の延滞を確認する"
  715.  
  716. library showOverdueLoansOn: 140.
  717.  
  718.  
  719. "すべての貸出履歴を表示する"
  720.  
  721. library showLoanHistory.
  722.  
  723.  
  724. "終了メッセージ"
  725.  
  726. '' displayNl.
  727. '========================================' displayNl.
  728. '大学図書館貸出システムを終了します' displayNl.
  729. '========================================' displayNl
  730. ]
Success #stdin #stdout 0.01s 9532KB
stdin
Standard input is empty
stdout
========================================
大学図書館貸出システムを開始します
図書館名: ○○大学図書館
========================================

===== 図書一覧 =====
Smalltalk入門 / 山田太郎 [ISBN: 978-4-00-000001-1] 貸出可能
オブジェクト指向設計 / 佐藤花子 [ISBN: 978-4-00-000002-8] 貸出可能
データベース基礎 / 鈴木一郎 [ISBN: 978-4-00-000003-5] 貸出可能

===== 利用者一覧 =====
田中学生 [利用者番号: S2023001, 区分: 学生, 貸出上限: 3冊]
佐々木教授 [利用者番号: T1001, 区分: 教職員, 貸出上限: 10冊]

===== 貸出処理結果1 =====
田中学生 が「Smalltalk入門」を貸出 / 貸出日: 100 / 返却期限: 114 / 貸出中

===== 貸出処理結果2 =====
佐々木教授 が「オブジェクト指向設計」を貸出 / 貸出日: 105 / 返却期限: 135 / 貸出中

===== 現在の貸出一覧 =====
田中学生 が「Smalltalk入門」を貸出 / 貸出日: 100 / 返却期限: 114 / 貸出中
佐々木教授 が「オブジェクト指向設計」を貸出 / 貸出日: 105 / 返却期限: 135 / 貸出中

===== 図書一覧 =====
Smalltalk入門 / 山田太郎 [ISBN: 978-4-00-000001-1] 貸出中
オブジェクト指向設計 / 佐藤花子 [ISBN: 978-4-00-000002-8] 貸出中
データベース基礎 / 鈴木一郎 [ISBN: 978-4-00-000003-5] 貸出可能

===== 延滞一覧 =====
確認日: 120日目
田中学生 が「Smalltalk入門」を貸出 / 貸出日: 100 / 返却期限: 114 / 貸出中 / 延滞日数: 6日

===== 返却処理結果 =====
田中学生 が「Smalltalk入門」を貸出 / 貸出日: 100 / 返却期限: 114 / 返却日: 121 / 返却済み

===== 現在の貸出一覧 =====
佐々木教授 が「オブジェクト指向設計」を貸出 / 貸出日: 105 / 返却期限: 135 / 貸出中

===== 図書一覧 =====
Smalltalk入門 / 山田太郎 [ISBN: 978-4-00-000001-1] 貸出可能
オブジェクト指向設計 / 佐藤花子 [ISBN: 978-4-00-000002-8] 貸出中
データベース基礎 / 鈴木一郎 [ISBN: 978-4-00-000003-5] 貸出可能

===== 延滞一覧 =====
確認日: 140日目
佐々木教授 が「オブジェクト指向設計」を貸出 / 貸出日: 105 / 返却期限: 135 / 貸出中 / 延滞日数: 5日

===== 全貸出履歴 =====
田中学生 が「Smalltalk入門」を貸出 / 貸出日: 100 / 返却期限: 114 / 返却日: 121 / 返却済み
佐々木教授 が「オブジェクト指向設計」を貸出 / 貸出日: 105 / 返却期限: 135 / 貸出中

========================================
大学図書館貸出システムを終了します
========================================