• ベストアンサー

課題がどうしても分かりません。

[問] レンタルビデオ屋のシステムを作ります。 このレンタルビデオ屋では、ビデオとDVDを貸し出しています。 ビデオあるいはDVDを借りるためには、まず会員にならなければなりません。 一度に借りられる本数は、DVDとビデオあわせて3本までです。 借りていられる期間は無期限ですが、何か借りているものがある間は、新たに借りることは出来ません。 DVDは再生が可能で、ビデオは再生と巻き戻しが可能です。 ビデオは必ず巻き戻してからでしか返却できません。 システムを構築するに当たって、継承とメソッドの多重定義を必ず使うこと。 クラスにVideoクラス,DVDクラス,mainメソッドを持ったクラスがあって、VideoクラスとDVDクラスは継承が出来ると思ったのですが…。 どんなプログラムになるのか全く分かりません。 どなたかご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

課題ということは、あまり答えすぎても本人のためにならないかもと思いつつも、とりあえず考え方の筋道を述べてみます。 >レンタルビデオ屋のシステムを作ります。 まずは、データベースをどのように構築するかが問題でしょう。 ざっと見たところでは 会員table(username(char), userid(int), nyukaidate(timestamp), kasidasi_flag(int), addr(varchar), tell(char)) 貸し出しリスト(userid(int), vvid(int), kasidate(timestamp), henkyakuyotei(timestamp), makicheck(boolean)) 商品table(vvname(char), vvid(int), vv(char), konyudate(timestamp), kasidasi_flag(boolean)) ※()内は field(type) この3つのtableが必要かと思います。 →これらにアクセスするclassをそれぞれ構築するとよさそうですね。 そして、それらを操作するメソッドをクラスに持たせる。 メソッドの多重定義は、同じ名前で、引数の数や型を変えて、似た操作のものを作るわけだから、id からtable情報を取り出す関数とnameからtable情報を取り出す関数とを考えれば、必然的に使うことになるでしょう。 この方法は覚えると結構重宝ですよね。 継承は、商品クラスを継承して、dvdクラスとvideoクラスを作るというのが 割とすぐ思いつきますね。 で、全体像は以下のような感じかな? 今、手元にリファレンスがないので、かなりおおざっぱに枠組みだけ示してみました。 予約語の記述間違いなどは、ご容赦願います。 というか、自分で調べて完璧になるようにしてください。 public rental extends Frame{ rental_system system; public void main(arg[],,){ //引数の記述がうろ覚え // rental_system の初期化 system = new rental_system(); //次に frame構築 操作パネル作成 (省略) } } class rental_system{ public rental_system(){ //初期化 =システムの起動 ー> databaseへのアクセス確立 } class syohin{ // 商品table へのアクセス public syohin(){ // 商品table へのアクセス確立 } public arraylist getSyohin(int sid){ // 商品id sidから 商品情報をarraylistで得る } public arraylist getSyohin(string sname){ // 商品名 snameから 商品情報をarraylistで得る // getSyohin多重定義 } public int setSyohin( string sname, string date){ // 商品名 sname, 購入日 date で新たに商品を登録し、作成された商品id を返す。 // 商品idは、登録順に連番などとする。 // 同名複数商品の場合は。。。製造番号か何か、もう一つ項目が要りそう } } class video extends shohin{ // 継承 public video(){ super(); // 商品table へのアクセス確立 // 貸し出しリストへのアクセスも確立 } public boolean makicheck(int sid){ // 巻き戻しチェック // 返却時巻き戻してあれば、trueを設定; // 巻き戻していなければfalseを設定; } } class user{ // 会員情報へのアクセス public user(){ // 会員table へのアクセス確立 } public arraylist getUser(int sid){ // 会員id sidから 会員情報をarraylistで得る } public arraylist getUser(string sname){ // 会員名 snameから 会員情報をarraylistで得る // getUser多重定義 } public int setUser( string sname, string date){ // 会員名 sname, 登録日 date で新たに会員を登録し、作成された会員id を返す。 // 登録済みならば、登録済みidを返す。同姓同名対策が必要。 } public int setRental(int sid, int r){ // sidの会員が 借りた(1~3)または返した(-1~-3)個数r を元のkasidasi_flagに足して、最終貸し出し数を返す } } // 貸し出しリスト (省略) }

asmodel
質問者

お礼

課題であるからこそ自分で解かなければ意味がないと思いながらも、解き方・導き方が見当もつかなかったため丸投げの投稿になってしまいました。 それにもかかわらずお答えいただきありがとうございます。 コメント付でアウトラインを教えていただけたので、大変分かりやすく、それをもとに解くことが出来ました。 ありがとうございました。

その他の回答 (2)

回答No.3

課題がわからない。 と自分では何もせずに丸投げ。 (もしかして何かしてるかもしれませんが、少なくとも「ここ」には「○○をした。」なんて記述ないですよね?) 「思ったのですが…。」 ↑は何もしてないに等しいですよ。 「どんなプログラムになるのか全く分かりません。」 全く分からない人に対して回答しようがないですよ。 困り度3:直ぐに回答ほしいです ↑なわりには回答をくれた人に対してなんのコメントもなし。 立派な「教えて君」の予備軍ですね。 参考URLのページを熟読することをオススメします。

参考URL:
http://myu.daa.jp/osiete/
  • tachiwa
  • ベストアンサー率34% (25/73)
回答No.2

課題の趣旨に合っているのか自信はありませんが、参考にして書き直してください。 javac Shop.java でコンパイルしてから、 java Shop asmodel 2 1 で会員名と借りる本数(video 2本 DVD 1本)を引数にして実行します。 import java.io.*; class Video{ private int rental = 0; public void setRental(int rental){ this.rental = rental; } public int getRental(){ return rental; } public void windUp(){ System.out.println("巻き直しの開始"); System.out.println("巻き直しの終了"); } public void play(){ System.out.println("再生の開始"); System.out.println("再生の終了"); } } class DVD extends Video{ public void play(){ super.windUp(); super.play(); } } public class Shop{ public static void main(String args[]){ Shop shop = new Shop(); if(shop.searchRegist(args[0])){ System.out.println(args[0] + "は登録されています"); }else{ System.out.println(args[0] + "は登録されていません"); shop.regist(args[0]); System.out.println(args[0] + "は登録されました"); } DVD dvd = new DVD(); Video video = new Video(); int v = Integer.parseInt(args[1]); int d = Integer.parseInt(args[2]); dvd.setRental(v + d); if(dvd.getRental() > 3){ System.err.println("本数オーバーです"); System.exit(1); }else{ System.out.println("DVDを楽しみます。"); dvd.play(); System.out.println("DVDは終わりました。"); System.out.println("Videoを巻きなおします。"); video.windUp(); System.out.println("Videoを巻きなおしました。"); System.out.println("Videoを楽しみます。"); video.play(); System.out.println("Videoは終わりました。"); } } public void regist(String name){ try{ BufferedWriter bw = new BufferedWriter(new FileWriter("regist.txt",true)); bw.write(name); bw.newLine(); bw.close(); } catch(IOException e){ e.printStackTrace(); } } public boolean searchRegist(String name){ boolean flag = false; try{ String line = ""; BufferedReader br = new BufferedReader(new FileReader("regist.txt")); while((line=br.readLine())!=null){ if(name.equals(line)){ flag = true; System.out.println(name +" registed"); } } br.close(); } catch(IOException e){ e.printStackTrace(); } return flag; } }

asmodel
質問者

お礼

課題の丸投げにも関わらず、お答えいただきありがとうございます。 BufferedReaderを利用してのテキスト読み出しは思いつかなかったことだったので、勉強になったと同時にプログラム全てを載せていただけたので流れがわかり、大変役立ちました。 ありがとうございました。

関連するQ&A