質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

3回答

7973閲覧

初めてメソッドを使って金額の割引を行うプログラムを書きましたが、うまく動きません...

chimo

総合スコア55

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2020/02/20 07:26

編集2020/02/20 08:34

コマンドライン引数から1つ以上の数値を受け取り、この1つ1つの数値を購入した商品の定価としたとき、
合計金額(税込)を求め、更に割引を利かせた金額を表示するプログラムを作りたいです。また、希望としてはmainメソッドの内容は書き換えずに処理が通るようにしたいです、つまり、書き換えるのはcalcTaxPaymentメソッドとdiscountメソッドのみ変更してプログラムが通るようにしたいです。

まずcalcTaxPaymentメソッドでしたいことは、割引後の総額に税金を付加した金額を計算したいです。引数として受け取った値の税込価格(消費税は8%)を計算して返したいのと、税込み価格は整数で表示されるようにキャストを使って表示させたいです。

また、discountメソッドでは、引数として受け取った値(割引前の総額)が1000以上5000以下の場合、1000より大きい商品については10%割引にし、引数として受け取った値が5000より大きい場合、1000より大きく5000円以下の商品については10%OFF、5000円より大きい商品については20%割引にしたいです。値引き額は、calcTaxPaymentメソッドと同様に、小数点以下切り捨てで計算したいです。また、できれば割引金額の上限は5000円としたいのですが、これは私の能力の限界のため以下に示す私が書いたコードの中には示されていません...。

上記の事柄を目的として私が書いたコードを以下に示します。

Java

1public static void main (String[] args) { 2 3 int totalPrice = 0 ; //購入した商品の合計金額 4 5 //コマンドライン引数から購入した商品の合計金額(定価)を取得 6 for(int i = 0 ; i < args.length ; i++ ){ 7 totalPrice += Integer.parseInt( args[i] ); 8 } 9 10 //discountメソッドを使って割引を適用し、割引後の金額を取得 11 int discountedPrice = discount( totalPrice ); //割引後の金額 12 13 //calcTaxPaymentメソッドを使って支払金額(税込)を取得 14 int taxPayment = calcTaxPayment( discountedPrice ); //支払金額(税込) 15 16 //支払金額(税込)を表示 17 System.out.println("割引後の支払金額:" + taxPayment + "円" ); 18 19 } 20 21 /* 22 **以下の仕様を持つメソッドcalcTaxPaymentを作成する。 23 ** - 引数として受け取った値の税込価格(消費税は8%とする)を計算して返す 24 ** - 税込価格は小数点以下切り捨てで返す 25 */ 26 static int calcTaxPayment( int dprice ){ 27 28 int calcResult1 = (int)(dprice * 1.08) ; 29 30 return calcResult1 ; 31 } 32 33 /* 34 **以下の仕様を持つメソッドdiscountを作成する。 35 ** - 引数として受け取った値が1000以上5000以下の場合、1000より大きい分について10%割引にする 36 ** - 引数として受け取った値が5000より大きい場合、1000より大きく5000円以下の分について10%OFF、5000円より大きい分について20%割引にする 37 ** - 値引き額は小数点以下切り捨てで返す 38 ** - 割引金額の上限は5000円とする 39 */ 40 static int discount( int total ){ 41 42 if((total>=1000)&&(total<5000)){ 43 44 if(args[i] > 1000){ 45 46 args[i] = (int)(args[i] * 0.9) ; 47 48 } 49 int calcResult2 += Integer.parseInt( args[i] ); 50 51 52 }else if(total > 5000){ 53 54 if((args[i]>1000)&&(args[i]<=5000)){ 55 56 args[i] = (int)(args[i] * 0.9) ; 57 58 }else if(args[i] > 5000){ 59 60 args[i] = (int)(args[i] * 0.8) ; 61 } 62 63 int calcResult2 += Integer.parseInt( args[i] ); 64 65 } 66 67 return calcResult2 ; 68 69 } 70 71} 72 73

このコードをコンパイルした時になぜか、「calcResult2の後に;を入れたら?」みたいなエラーが出てきますが、そんな馬鹿な…と思っています。そんなところに;を入れてしまっては計算が途中で終わってしまうし、そんなコード見たこともないし...。エラーのアドバイスがあてにならないのでみなさんの力添えお願いしたいです。どなたか教えて頂ければ大変嬉しく思います。お願いいたします!!

【追記】
理解しにくい質問内容を投稿してしまい申し訳ないです。
自分的には、例えばコマンドライン引数で6000, 2000, 1000を受け取って合計金額が9000円だった場合、9000は5000より上なので、1000より大きく5000円以下の商品については10%OFF、5000円より大きい商品については20%割引にしたいから、6000は60000.8(小数点以下切り捨て), 2000は20000.9(小数点以下切り捨て), で1000はそのままで、もう一度和を算出する。というのが、discountメソッドでしたいことです。そのためにはコマンドライン引数で受取った各値が5000より大きいのか、1000より大きく5000以下なのかを評価しないといけないため、args[i]を使ってint calcResult2 += Integer.parseInt( args[i] )と表示してしまいました。どうすればメインメソッド内のコマンドライン引数で受取った各値をdiscountメソッドで評価できますでしょうか。 変数のスコープを考えればエラーが出ることは承知しておりますが、どのように表現すればよいかわからなかったためint calcResult2 += Integer.parseInt( args[i] );という意味不明なコードを書いてしまいました...。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/02/20 07:34

int calcResult2 += Integer.parseInt( args[i] ); これは何をしようと思って書いたのか説明してください
退会済みユーザー

退会済みユーザー

2020/02/20 07:41

何をお願いされているのでしょうか? 「ビルドエラーが解決できない」が、本題ですか? 「動くものを作ってください」が、本題ですか? 前者であれば、 > 「calcResult2の後に;を入れたら?」みたいなエラー のような、個人的に解釈したものではなく、出てくるそのままを投稿される方がいいかと思います。 後者の場合は、ヘルプの「質問するときのヒント」を読みましょう。 https://teratail.com/help/question-tips
guest

回答3

0

ベストアンサー

"変数のスコープ"という言葉を聞いた事ありますか?
プログラムの中で変数が有効な範囲というような意味で、その範囲内で変数名が同じものは、同じ変数だと扱われます。スコープが異なると、同じ変数名でも、別の変数だとして扱われます。

例えば、argsという変数はmain関数の引数なので、main関数の中で有効です。
同様に、totalという変数はdiscount関数の引数なので、discount関数の中で有効です。

しかし、argsはdiscount関数の引数ではないですし、discount変数の中で宣言されている訳でもないので、discount関数の中で有効ではない(何だか判らない物)なのです。
iとかcalcResult2とかは初期化されていない(値が何なのか判らない)物ですね。
だから、discount関数をコンパイルしたら、args,i,calsResult2に関連したエラーが出るだろうと思います。

まずは、こういう観点から考えてプログラムを修正してみては如何でしょうか。
とにかくコンパイルできる(コンパイル時にエラーが出ない)プログラムにしないと先に進めません。
===

int calcResult1 = (int)(dprice * 1.8) ;

(int)で実数を整数に変換しても良いのですが、代わりにfloor(小数点以下切り捨て)、ceiling(小数点以下切り上げ)、round(小数点以下四捨五入)を使うと小数点以下の処理をどうしたのかがプログラムからすぐに読み取れるのでお勧めです。

消費税が8%だと、税込み価格は税抜き価格の108%(1.08)になります。
(int)(dprice * 1.08); とすべきですね。

===
まぁ、最初はエラーに悩まされると思いますが、すこしずつ修正していくと最後にはちゃんと動くプログラムになります。
あせらずに、修正していってください。

投稿2020/02/20 08:04

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chimo

2020/02/20 08:33

変数のスコープのことは承知しております(習いたてですが...)。自分的には、例えばコマンドライン引数で6000, 2000, 1000を受け取って合計金額が9000円だった場合、9000は5000より上なので、1000より大きく5000円以下の商品については10%OFF、5000円より大きい商品については20%割引にしたいから、6000は6000*0.8(小数点以下切り捨て), 2000は2000*0.9(小数点以下切り捨て), で1000はそのままで、もう一度和を算出する。というのが、discountメソッドでしたいことです。そのためにはコマンドライン引数で受取った各値が5000より大きいのか、1000より大きく5000以下なのかを評価しないといけないため、args[i]を使ってint calcResult2 += Integer.parseInt( args[i] )と表示してしまいました。スコープのことを考えればエラーがでることはわかっていましたが他に手段が分からずにそのようにかいてしまいました。ceiling(小数点以下切り上げ)、round(小数点以下四捨五入)は、どちらも知りませんでした!教えてくださってありがとうございます!!また、消費税計算の凡ミスも指摘してくださりありがとうございます。お恥ずかしい限りです...。w
guest

0

Java

int calcResult2 += Integer.parseInt( args[i] );

このような文法はJavaには無いです。
おそらく次のように書けば、少なくともこのエラーは解消されるでしょう。

Java

1if(...) { 2 ... 3} 4else if(...) { 5 ... 6} 7 8int calcResult2 = Integer.parseInt(args[i]); 9return calcResult2; // 単に return Integer.parseInt(args[i]); でも良い

argsとiも当該メソッド内では参照できませんね。
変数のスコープについて調べてみて下さい。

投稿2020/02/20 07:30

編集2020/02/20 07:32
LouiS0616

総合スコア35668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chimo

2020/02/20 07:43

回答ありがとうございます。スコープは今日初めて学習しましので、自分でも疑いながらやったのですがやっぱり駄目だったんですね。自分的には、例えばコマンドライン引数で6000, 2000, 1000を受け取って合計金額が9000円だった場合、9000は5000より上なので、1000より大きく5000円以下の商品については10%OFF、5000円より大きい商品については20%割引にしたいから、6000は6000*0.8(小数点以下切り捨て), 2000は2000*0.9(小数点以下切り捨て), で1000はそのままで、もう一度和を算出する。というのが、discountメソッドでしたいことです。そのためにはコマンドライン引数で受取った各値が5000より大きいのか、1000より大きく5000以下なのかを評価しないといけないため、args[i]を使ってint calcResult2 += Integer.parseInt( args[i] )と表示してしまいました。どうすればメインメソッド内のコマンドライン引数で受取った各値をdiscountメソッドで評価できますでしょうか。
LouiS0616

2020/02/20 07:52

ちょっと思ったんですけれど、discountメソッドの仕様を間違えて捉えていませんか。 総額に応じて割引を与えるメソッドなら、商品一点一点の値段を気にする必要が無いように思います。
LouiS0616

2020/02/20 07:54

コード内のコメントには『1000より大きい分』とは書いてありますが、『1000より大きい商品』とは書いていません。 サンプルの入出力から類推するか、出題者に問い合わせてみると良いです。
chimo

2020/02/20 07:58

返信ありがとうございます!!私が難しく問題を解釈していただけかもしれないですね...。出題者のかたに伺ってみようとおもいます。返信ありがとうぎざいます!!
chimo

2020/02/20 08:28

ただ、自分的に考えたことですが、「引数として受け取った値が5000より大きい場合、1000より大きく5000円以下の分については10%OFF、5000円より大きい分については20%割引にする」というのは、まず「引数として受取った値」とは「コマンドライン引数から受け取った数値の合計」ですよね?つまり総額です。ですが、その後に出てくる「5000円以下の分」というのは、もしこの言葉が表すものがコマンドライン引数から受け取った各値(各商品の値段)ではなく総額であれば、なぜ5000円より大きい場合について論じているのにそのあとで5000以下のことに関して考えようとしているのかが矛盾しているように思えます。
LouiS0616

2020/02/20 08:31

『(discountメソッドが)引数として受け取った値』という意味かと思います。
LouiS0616

2020/02/20 08:34

> なぜ5000円より大きい場合について論じているのにそのあとで5000以下のことに関して考えようとしているのかが矛盾しているように思えます。 6000円買い物をしたら、 『1000以下』の1000円分がそのまま、 『1000以上5000以下』の4000円分が10%off, 『5000円以上』の1000円分が20%off。という意味では。多分ですけど。 この場合600円割引になりますね。
guest

0

int calcResult2 += Integer.parseInt( args[i] );は文法的に成立しません。そして、Javaの場合、ブロック内で宣言された変数は外側で使うことはできません。

discountメソッドの最初でint calcResult2 = 0;と宣言してください。

投稿2020/02/20 07:29

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問