• ベストアンサー

ある問についてアドバイスを頂けますか

最近、ここを良く使っているものです。 例えば、ある商品名と金額を入力して、その消費税と賞味期限(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) + "日" + "です。"); } } 以上です。 勿論、コンパイルエラーになります。 ヒントでいいのでアドバイスを頂ければ、大変幸いです。 本当にヒントだけでいいので、どうぞ宜しくお願い致します。

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

  • ベストアンサー
  • Noriwo003
  • ベストアンサー率61% (8/13)
回答No.4

Syohinクラスのソースとエラーメッセージを教えてください。 現状でおかしいところは int kigen = myCal.add(Calendar.MONTH, 2); Calender#addメソッドはカレンダーの日付・時刻を変更するメソッドで戻り値はありません。 2ヵ月後の値がほしいならDateクラスとSimpleDateFormatクラスについて調べてみてください。

persona
質問者

お礼

レスを頂き、ありがとうございます。 何て言うのでしょうか。今までの回答の中で初めて手を差し伸べて下さった感じがします。 ヒントを参考に調べてみます。 ようやく、光明の兆しが見えてきたような気がします。

persona
質問者

補足

質問にはヒントだけでいいと言ってしまいましたが、実際にヒントを頂いても全然活かせませんでした。 まず1つ大きなミスがありました。それは、賞味期限を出すKigen()メソッドを作らなければならなかった事です。 例えば Calendar myCal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yy'年'MM'月'dd'日'"); Date date = myCal.getTime(); String str = sdf.format(date); とこれでは現在の年月日を表示させるだけで、賞味期限をどうするのかが書かれていないのでダメですね。 任意の年月日から1ヵ月後の賞味期限を出す方法はあるのでしょうけど、自分の頭では分かりません。 どうかもう少しだけアドバイスを頂けないものでしょうか。 どうぞ宜しくお願い致します。

その他の回答 (5)

  • Noriwo003
  • ベストアンサー率61% (8/13)
回答No.6

>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日等) また、うるう年の問題も絡んできますが、まずは上記を解決してみましょう。

persona
質問者

お礼

再度のレスを頂き、ありがとうございます。 回答は参考にさせてもらいます。 問題は沢山ありますが、どうにか頑張って完成できるように努力したいと思います。 >また、消費期限とは別に、何か月持つかという情報を持たせると、色々な商品に対応できます。 これは新しい考え方ですね。勉強になります。

  • mako_sea
  • ベストアンサー率47% (62/130)
回答No.5

Calenderクラスでaddを利用する方法でもいけますよ。 例えばこんな風に。 class Syohin2 extends Syohin1 { Calendar myCal = Calendar.getInstance(); int kigen; public Syohin2(){ myCal.add(Calendar.MONTH, 2); kigen = myCal.get(Calendar.MONTH); } }

persona
質問者

お礼

おお!!! これは凄い。 これで完成ですね。 Noriwo003さんの言われているSimpleDateFormatクラスとDateクラスも挑戦してみたのですが、どうしても上手くいかずに悩んでいたところです。 では、コンパイルしてみますね。 貴重なアドバイスを頂き、感謝します。

persona
質問者

補足

大変有り難かったアドバイスだったんですが、残念ながら2つほどクリアできていない箇所がありました。 1つは質問の際に書かなかったせいもあるのですが、賞味期限を出すメソッドを作成しなければならなかった事です。 思いっきり間が抜けていました。 それと、このコンストラクタだと確かに1ヶ月先の賞味期限が求められるのですが、ここでも自分のソースコードの書き方に誤りがありました。 これだと現在の年月日から1ヶ月の表示しかできず、例えば任意の年月日を設定ができないという点です。 明らかに自分のソースコードの記述間違いからくる問題なので、mako_seaさんには大変ご迷惑をおかけした事を深くお詫びします。 この部分はもう1度やり直しですね。

  • mako_sea
  • ベストアンサー率47% (62/130)
回答No.3

コンパイルが通らない原因は下記の3つです。 1.ソース6行目がセミコロンで終わっていない 2.class Syohin2 extends Syohin と宣言しているが   Syohin というクラスが存在しない(Syohin1の間違い?) 3.カレンダークラスのAPIメソッドaddの戻り値はvoidなのにintに代入しようとしている。 多分コンパイル時にヒントになるエラーメッセージは出てると思います。 初めは1つずつ理解しながら進むのが大事です。 上記を解決しても、仕様通りに動かないかも知れませんが がんばってデバッグしてみてください。

persona
質問者

お礼

レスを頂き、ありがとうございます。 タイプミスは随分ありました。恥ずかしい事です。 問題は3ですね。 他のエラーは消えたのですが、ここが分からないので先へ進めません。 皆さん、すぐに気づくのですかね。 addの戻り値がvoidなのにintの変数に入れようとしている部分ですが。 そこが分からない自体でダメダメですね。 そこが分かると先へ進めるのでしょうけど、そこができないんですね。 このまま完成せずに終わってしまうのでしょうか。

  • ww-_-ww
  • ベストアンサー率51% (46/89)
回答No.2

つっこみどころが満載すぎます。 String item: →なんでコロンなのか int kigen = myCal.add(Calendar.MONTH, 2); →なんでこんなところで処理しているのか 他にもいろいろあります。 No1の方も言っている通り、コンパイルエラーのメッセージをよくみてひとつずつ修正するしかないです。

persona
質問者

お礼

レスを頂き、ありがとうございます。 そうですね。少し前に後1つだけまでに減らせました。 そこからが問題ですね。 て言うより、 int kigen = myCal.add(Calendar.MONTH, 2); の部分なんですけど……。 ここで処理しちゃいけないのですか。 それも知らない大バカ者をお許し下さい。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「勿論、コンパイルエラーになります。」 っていうんだから, エラーメッセージは出てるんだよね. それを見て直してください.

persona
質問者

お礼

はい、そうします。

関連するQ&A

専門家に質問してみよう