- ベストアンサー
ある問についてアドバイスを頂けますか
最近、ここを良く使っているものです。 例えば、ある商品名と金額を入力して、その消費税と賞味期限(1ヶ月)を出すプログラムについてです。 クラスは全部で3つ。それぞれ目的があります。 1つ目をSyohinクラスとします。 ここには、消費税を表すTAX=0.05という変数があります。 それとここで消費税を算出するメソッドを作ります。 第2のクラスをSyohin2とします。 これはSyouhinクラスをスーパークラスとしています。 そして、ここで賞味期限を算出するメソッドを作ります。 第3はmainメソッドがある大元のSampleクラスがあります。 最終的にどのようになるかは、こんな感じです。 売り上げた商品名と金額を入力して下さい。 Javaケーキ(手動入力) 1000(手動入力) 商品名=Javaケーキの消費税は50.0円です。 商品名=Javaケーキは賞味期限が2009年2月17日とする。(現在日付が2009年1月17日の場合) これでプログラムを自分なりに作成してみました。 import java.util.*; import java.io.*; class Syohin1 { private double TAX = 0.05; String item: int kingaku; public Syohin1() { System.out.println("売り上げた商品名と金額を入力して下さい。"); } public void Syohizei(double p1) { TAX = p1; double syohizei = kingaku * TAX; System.out.println("商品名=" + item + "の消費税は" + syohizei + "です。"); } } class Syohin2 extends Syohin { Calendar myCal = Calendar.getInstance(); int kigen = myCal.add(Calendar.MONTH, 2); } public class JTest11 { public static void main(String[] args) throws IOException { Syohin2 syohin = new Syohin2(); BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); syohin.item = buf.readLine(); syohin.kingaku = Integer.parseInt(buf.readLine()); Calendar myCal = Calnedar.getInstance(); syohin.Syohizei(0.05); System.out.println("商品名=" + syohin.item + "は消費期限が" + myCal.get(Calender.YEAR) + "年" + syohin.kigen + "月" + myCal.get(Caledar.DATE) + "日" + "です。"); } } 以上です。 勿論、コンパイルエラーになります。 ヒントでいいのでアドバイスを頂ければ、大変幸いです。 本当にヒントだけでいいので、どうぞ宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Syohinクラスのソースとエラーメッセージを教えてください。 現状でおかしいところは int kigen = myCal.add(Calendar.MONTH, 2); Calender#addメソッドはカレンダーの日付・時刻を変更するメソッドで戻り値はありません。 2ヵ月後の値がほしいならDateクラスとSimpleDateFormatクラスについて調べてみてください。
その他の回答 (5)
- Noriwo003
- ベストアンサー率61% (8/13)
>SimpleDateFormat sdf = new SimpleDateFormat("yy'年'MM'月'dd'日'"); "yy'年'MM'月'dd'日'"⇒"yyyy/MM/dd"に変更 MMの部分を取り出す(String#substringまたはString#splitを参照。) MMを数値に変換して足し算を行う(Integer#parseIntを参照。) >任意の年月日から1ヵ月後の賞味期限を出す方法はあるのでしょうけど、自分の頭では分かりません。 任意の年月日(製造日)をSyouhin2クラスに持たせる必要がありますね。 また、消費期限とは別に、何か月持つかという情報を持たせると、色々な商品に対応できます。 ユーザーに製造日を入力させた場合、その日付が正しいかどうか判定する必要が出てきます。(2009年13月32日等) また、うるう年の問題も絡んできますが、まずは上記を解決してみましょう。
お礼
再度のレスを頂き、ありがとうございます。 回答は参考にさせてもらいます。 問題は沢山ありますが、どうにか頑張って完成できるように努力したいと思います。 >また、消費期限とは別に、何か月持つかという情報を持たせると、色々な商品に対応できます。 これは新しい考え方ですね。勉強になります。
- mako_sea
- ベストアンサー率47% (62/130)
Calenderクラスでaddを利用する方法でもいけますよ。 例えばこんな風に。 class Syohin2 extends Syohin1 { Calendar myCal = Calendar.getInstance(); int kigen; public Syohin2(){ myCal.add(Calendar.MONTH, 2); kigen = myCal.get(Calendar.MONTH); } }
お礼
おお!!! これは凄い。 これで完成ですね。 Noriwo003さんの言われているSimpleDateFormatクラスとDateクラスも挑戦してみたのですが、どうしても上手くいかずに悩んでいたところです。 では、コンパイルしてみますね。 貴重なアドバイスを頂き、感謝します。
補足
大変有り難かったアドバイスだったんですが、残念ながら2つほどクリアできていない箇所がありました。 1つは質問の際に書かなかったせいもあるのですが、賞味期限を出すメソッドを作成しなければならなかった事です。 思いっきり間が抜けていました。 それと、このコンストラクタだと確かに1ヶ月先の賞味期限が求められるのですが、ここでも自分のソースコードの書き方に誤りがありました。 これだと現在の年月日から1ヶ月の表示しかできず、例えば任意の年月日を設定ができないという点です。 明らかに自分のソースコードの記述間違いからくる問題なので、mako_seaさんには大変ご迷惑をおかけした事を深くお詫びします。 この部分はもう1度やり直しですね。
- mako_sea
- ベストアンサー率47% (62/130)
コンパイルが通らない原因は下記の3つです。 1.ソース6行目がセミコロンで終わっていない 2.class Syohin2 extends Syohin と宣言しているが Syohin というクラスが存在しない(Syohin1の間違い?) 3.カレンダークラスのAPIメソッドaddの戻り値はvoidなのにintに代入しようとしている。 多分コンパイル時にヒントになるエラーメッセージは出てると思います。 初めは1つずつ理解しながら進むのが大事です。 上記を解決しても、仕様通りに動かないかも知れませんが がんばってデバッグしてみてください。
お礼
レスを頂き、ありがとうございます。 タイプミスは随分ありました。恥ずかしい事です。 問題は3ですね。 他のエラーは消えたのですが、ここが分からないので先へ進めません。 皆さん、すぐに気づくのですかね。 addの戻り値がvoidなのにintの変数に入れようとしている部分ですが。 そこが分からない自体でダメダメですね。 そこが分かると先へ進めるのでしょうけど、そこができないんですね。 このまま完成せずに終わってしまうのでしょうか。
- ww-_-ww
- ベストアンサー率51% (46/89)
つっこみどころが満載すぎます。 String item: →なんでコロンなのか int kigen = myCal.add(Calendar.MONTH, 2); →なんでこんなところで処理しているのか 他にもいろいろあります。 No1の方も言っている通り、コンパイルエラーのメッセージをよくみてひとつずつ修正するしかないです。
お礼
レスを頂き、ありがとうございます。 そうですね。少し前に後1つだけまでに減らせました。 そこからが問題ですね。 て言うより、 int kigen = myCal.add(Calendar.MONTH, 2); の部分なんですけど……。 ここで処理しちゃいけないのですか。 それも知らない大バカ者をお許し下さい。
- Tacosan
- ベストアンサー率23% (3656/15482)
「勿論、コンパイルエラーになります。」 っていうんだから, エラーメッセージは出てるんだよね. それを見て直してください.
お礼
はい、そうします。
お礼
レスを頂き、ありがとうございます。 何て言うのでしょうか。今までの回答の中で初めて手を差し伸べて下さった感じがします。 ヒントを参考に調べてみます。 ようやく、光明の兆しが見えてきたような気がします。
補足
質問にはヒントだけでいいと言ってしまいましたが、実際にヒントを頂いても全然活かせませんでした。 まず1つ大きなミスがありました。それは、賞味期限を出すKigen()メソッドを作らなければならなかった事です。 例えば Calendar myCal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yy'年'MM'月'dd'日'"); Date date = myCal.getTime(); String str = sdf.format(date); とこれでは現在の年月日を表示させるだけで、賞味期限をどうするのかが書かれていないのでダメですね。 任意の年月日から1ヵ月後の賞味期限を出す方法はあるのでしょうけど、自分の頭では分かりません。 どうかもう少しだけアドバイスを頂けないものでしょうか。 どうぞ宜しくお願い致します。