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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Q&A

解決済

4回答

836閲覧

戻り値の扱いについて

NEKOTABETAI

総合スコア14

Java

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

0グッド

3クリップ

投稿2020/08/04 14:50

前提・実現したいこと

今金額を計算するプログラムを作っているのですがなぜかエラーになってしまいます。
やりたいことは、コマンドライン引数の値を足して合計が1000円より大きく5000円以下なら-10%し、
5000円より大きいのであれば-20%するといったものが作りたいです。

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 代入の左側は変数でなければなりません 構文エラーがあります。"AssignmentOperator Expression" を挿入して Assignment を完了してください 構文エラーがあります。";" を挿入して Statement を完了してください at Sample4.discount(Sample4.java:36) at Sample4.main(Sample4.java:16)

該当のソースコード

Java

1 2public class Sample4 { 3 4 public static void main(String[] args) { 5 6 int total = 0 ; 7 8 for(int i = 0 ; i < args.length ; i++) { 9 10 total = total + Integer.parseInt(args[i]) ; 11 12 } 13 14 int totalTax = calcTax(total) ; 15 16 int payment = discount(totalTax) ;         //16行目 17 18 System.out.println("合計金額 :" + payment) ; 19 20 21 } 22 23 static int calcTax(int total) { 24 25 double calcTax = total * 1.08 ; 26 27 return (int)calcTax ; 28 } 29 30 static int discount(int totalTax) {             //30行目 31 32 if(totalTax > 1000 & totalTax <= 5000) { 33 34 double discount = (totalTax - 1000) * 0.9 ; 35 36 return (int)discount ; 37 38 }else if(totalTax > 5000){ 39 40 double discount = (totalTax - 5000) * 0.8 ; 41 42 return (int)discount ; 43 } 44 } 45 46}

試したこと

かれこれ30分以上見返していて、if節の中にreturn文があるからなのかなー、と思ったりしてるのですがreturn文を
うまく外に出してあげる方法も思いつきません。
いろいろ試していて一部のコードを変えるたび、問題がなかったところでもエラーが起きたりしたので
問題が検出されているところ以外でもなにかおかしなところがあるかもしれません。
どなたかデバッグをお願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

税抜価格から割引したあと、8% 課税するならこんな感じですね。

Java

1public class Sample4 { 2 3 public static void main(String[] args) { 4 int total = 0; 5 6 for (String arg : args) { 7 total = total + Integer.parseInt(arg); 8 } 9 10 int discount = discount(total); 11 int payment = calcTax(discount); 12 13 System.out.println("合計金額 :" + payment); 14 } 15 16 static int calcTax(int total) { 17 double calcTax = total * 1.08; 18 19 return (int)calcTax; 20 } 21 22 static int discount(int total) { 23 24 double discount; 25 26 if(total > 1000 && total <= 5000) { 27 discount = total * 0.9; 28 }else if(total > 5000){ 29 discount = total * 0.8; 30 }else { 31 discount = total; 32 } 33 34 return (int)discount; 35 } 36}

投稿2020/08/05 14:23

Marie

総合スコア19

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

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

NEKOTABETAI

2020/08/05 15:46

回答ありがとうございます。この方法が一番よさそうです。
guest

0

keicha_hrsさんの回答にありますが

discount()のif〜else ifのどちらの条件にも合致しなかった場合の戻り値がないからではありませんか?

ですね。
つまり、割引していないケースがreturnされていません。

なんか気になったのですが、割引って税込み価格でやります?
※合計1000円の場合って、割引なしで1080円にするのでは?
2000円の10%引きって、1800円+税じゃないの?
※実際に表示される金額が・・・
仕様の提示が間違ってるのかな・・・

java

1 static int discount(int totalTax) { 2 3 if (totalTax > 1000 & totalTax <= 5000) { 4 5 double discount = (totalTax - 1000) * 0.9; 6 7 return (int) discount; 8 9 } else if (totalTax > 5000) { 10 11 double discount = (totalTax - 5000) * 0.8; 12 13 return (int) discount; 14 } 15 16 return 0; 17 } 18

投稿2020/08/04 15:38

編集2020/08/04 17:02
momon-ga

総合スコア4826

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

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

momon-ga

2020/08/04 15:40

おっと、discountは割引額じゃなくて割引後の金額か。 returnは0でなくて、totalTaxですね。
NEKOTABETAI

2020/08/05 15:11

回答ありがとうございます。確かに割引してないときの戻り値がないのが原因でした。 金額の合計が確かにおかしいですね。見直してみます。
guest

0

discount()のif〜else ifのどちらの条件にも合致しなかった場合の戻り値がないからではありませんか?

それと、

java

1 if(totalTax > 1000 && totalTax <= 5000) {

のように&&にしなければ期待する結果は得られないでしょう。

投稿2020/08/04 15:04

keicha_hrs

総合スコア6768

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

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

NEKOTABETAI

2020/08/04 15:13

回答ありがとうございます。&&が「AかつB」という事でしょうか
keicha_hrs

2020/08/04 15:51 編集

そうです・・・と言いたいところだけど、この場合はどちらでも良かったのか。そこは申し訳ないです。 ところで、discount()メソッドについてなんですが、 double pay1 = (totalTax - 1000) * 0.9 ; や double pay2 = (totalTax - 5000) * 0.8 ; という計算をされていますが、この1000引いたり5000引いたりする計算は必要なのでしょうか?また、税込価格に対して計算するという条件なのですか? 今の式だと、例えば3000円のものがあったら、課税した3240円から1000円引いた2240円に0.9倍した2016円が答えになってしまいますが・・・これではおかしいですよね?
keicha_hrs

2020/08/04 15:53

momon-gaさんのおっしゃるように、割引計算を課税前の価格に対して行うのか、課税後の価格に対して行うのかという仕様の再確認も必要そうですね。
Marie

2020/08/05 13:41

本筋ではないですが、&&と&の違いについて少々。 A && B AがFalseならBは評価せずにFalseを返します。(短絡演算) A & B Aの評価値によらず、必ずBも評価します。 つまり、使い分けとしては、 Bの内部で副作用を与えない場合には&&を使い、 Bの内部で副作用を与える場合には&を使います。 &&を使うべき場面で&を使用すると、結果は変わりませんが、無駄な計算が発生することになるため、どちらでも良いわけではありません。
NEKOTABETAI

2020/08/05 15:15

@keicha_hrsさん回答ありがとうございます。もう一度仕様を見直してみます。
NEKOTABETAI

2020/08/05 15:17

@Marieさん補足説明ありがとうございます。今回の場合だと&&が適切だったのですね。
guest

0

関数名と同名の変数が定義されてます。
これダメです

そして、同名の変数を複数箇所で定義してますが、これもダメです

投稿2020/08/04 14:56

y_waiwai

総合スコア88042

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

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

NEKOTABETAI

2020/08/04 15:10

```Java public class Sample4 { public static void main(String[] args) { int total = 0 ; for(int i = 0 ; i < args.length ; i++) { total = total + Integer.parseInt(args[i]) ; } int totalTax = calcTax(total) ; int payment = discount(totalTax) ; System.out.println("合計金額 :" + payment) ; } static int calcTax(int total) { double calcTax = total * 1.08 ; return (int)calcTax ; } static int discount(int totalTax) { if(totalTax > 1000 & totalTax <= 5000) { double pay1 = (totalTax - 1000) * 0.9 ; return (int)pay1 ; }else if(totalTax > 5000){ double pay2 = (totalTax - 5000) * 0.8 ; return (int)pay2 ; } } } ``` 直してみましたがこういう事であっていますか? あとこれでも戻り値がかえってなさそうです。
momon-ga

2020/08/04 15:31

低評価しました。 >関数名と同名の変数が定義されてます。 >これダメです そんなことないでしょ。 > そして、同名の変数を複数箇所で定義してますが、これもダメです ダメではありますが、今回のケースは関係ない(ブロックが違うので定義できる)
kazuma-s

2020/08/04 15:33

> 関数名と同名の変数が定義されてます。これダメです そんなことはありません。 public static void main(String[]args) { int main = 23; System.out.println(main); }
NEKOTABETAI

2020/08/05 15:44

皆さん回答ありがとうございます。なんか同じ名前使ったら大変そうですから 次から気を付けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問