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

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

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

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

Q&A

解決済

6回答

2131閲覧

if文について問題のくみ取り方とソースを書く流れについて

r--

総合スコア18

Java

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

0グッド

0クリップ

投稿2019/05/12 06:09

前提・実現したいこと

問題を理解できないときどうしてますか?

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

仕様 料金割引設定
➀クーポン持参:10%0ff
➁平日割引:30%off
➂平日シニア割引(65歳以上):50%off
※2つ以上の割引サービスが重なった場合は、割引率が高い方が優先される。
条件Y:その条件に該当する N:その条件に該当しない
適用割引 Y:その割引率を適用する。-:その割引率を適用しない。

下のように書ける意味が分からないのと
優先順位
50%off→平日で65歳以上
30%0ff→平日
10%→クーポン
なし→全て×

該当のソースコード

package lesson00; import java.io.*; public class rennsyu{ public static void main(String []args)throws IOException { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); System.out.println("クーポン持参ですか?"); String str =br.readLine(); char coupon =str.charAt(0); System.out.println("平日ですか?"); str=br.readLine(); char weekday=str.charAt(0); System.out.println("何歳ですか?"); String str =br.readLine(); int age =Integer,parseInt(str); String sale=""; if(Weekday =='Y'&&>=65){ sale="50%OFF"; } else if (weekday=='Y'){ sale ='30%OFF"; } else if (coupon=='Y'){ sale="10%OFF"; } else{ sale="割引なし"; } System.out.println("あなたは"+sale+"です。"); } }

条件
||ルール|列1|列2|列3|列4|列5|列6|列7|列8|
|:-- |:--:|--:|
|クーポン持参||Y|Y|Y|Y|N|N|N|N
|:--|:--:|--:|
|平日||Y|Y|N|N|Y|Y|N|N
|:--|:--:|--:|
|65歳以上||Y|N|Y|N|Y|N|Y|N
|:--|:--:|--:|

適用割引
||ルール|列1|列2|列3|列4|列5|列6|列7|列8|
|:-- |:--:|--:|
|割引なし||||||||Y|Y
|:--|:--:|--:|
|10%OFF||||Y|Y||||
|:--|:--:|--:|
|30%OFF|||Y||||Y||
|:--|:--:|--:|
|50%OFF||Y||||Y|||
|:--|:--:|--:|

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

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

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

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

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

m.ts10806

2019/05/12 07:13

>問題を理解できないとき その「問題」とは、例えばテストやなんかの「問題」でしょうか それともバグや不具合などの「問題」でしょうか はたまた別の意味でしょうか せめて文章としての自然に流れるように書いてください。
r--

2019/05/12 13:20

優先順位の組取り方含め(算数か数学で被る範囲を勉強し直す必要もありそうですが、それがどの範囲なのか分からないのです。)仕様から優先順位→なぜString sale="";から上と下で分けられるのかと、iif else文使うのかが思いつかないので、そういうときはどうしていたのでしょうか。 構文もそのまま覚えると言われたら、意味を理解せずに(動きの特性)入ってこないのです。
m.ts10806

2019/05/12 13:28

ちょっと意味が分かりません。私の指摘事項はどこまで理解されたのでしょうか。「質問本文をきちんと文書として伝わるものにしてください」という依頼で質問者さんは何を語ってらっしゃいますか?
ngsvx

2019/05/12 15:58

既にあるコードのロジックが理解できないのか、それとも、この問題を解くためのロジックを作成出来ないのか、どちらなのでしょうか? ところどころで、反対のことを言っているように受け取れます。
r--

2019/05/13 20:49

どちらもです。 まず、仕様から優先順位を書くことが出来ません。
退会済みユーザー

退会済みユーザー

2019/05/13 23:32

提示のコードはコンパイルエラーになりそうですが、まずは試したことを書いてコンパイルしてください
r--

2019/05/19 13:10

package lesson00; import java.io.*; public class rensyu{ public static void main(String []args)throws IOException { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); System.out.println("クーポン持参ですか?"); String str =br.readLine(); char coupon =str.charAt(0); System.out.println("平日ですか?"); str=br.readLine(); char weekday=str.charAt(0); System.out.println("何歳ですか?"); String str1 =br.readLine(); int age =Integer.parseInt(str); String sale=""; if(weekday =='Y'&&age<=65){ sale="50%OFF"; } else if (weekday=='Y'){ sale ="30%OFF"; } else if (coupon=='Y'){ sale="10%OFF"; } else{ sale="割引なし"; } System.out.println("あなたは"+sale+"です。"); } } と、直しました。しかし、問題とプログラムが分かっていないので、コンソールに何を入れていったらいいか分からないです。
guest

回答6

0

正直、日本語の読み書きが苦手というのは結構致命的かと・・・
エスパーばりに、いろいろくみ取ってみます。

デシジョンテーブルが理解できていないのであれば、そこから勉強してみてください。

String sale="";の上と下のコードの塊がパッと思い浮かばなく

上のコードというのは、クーポン持参ですか?などの、入力受付だと推測します。
ルールの条件が
クーポン持参、平日、65歳以上のY/Nなので、それを判定するために変数に格納しています。

下のコードは、条件の判定部分だと推測します。
他の回答者さんのいうとおり

※2つ以上の割引サービスが重なった場合は、割引率が高い方が優先される。

とありますので、割引率の高い順に条件を満たしているか確認しています。

なぜ、その条件なのか?
は、日本語の仕様を理解していただくか、
デシジョンテーブルの読み方を理解するしかないです。


ここから追記

こうゆうこと?
デシジョンテーブルを愚直に実装すると以下のようなif文になるはずで

java

1if(coupon == 'Y' && weekday == 'Y' && age >= 65) { 2 // ルール列1 3 sale = "50%OFF"; 4}else if(coupon == 'Y' && weekday == 'Y' && age < 65) { 5 // ルール列2 6 sale = "30%OFF"; 7}else if(coupon == 'Y' && weekday != 'Y' && age >= 65) { 8 // ルール列3 9 sale = "10%OFF"; 10}else if(coupon == 'Y' && weekday != 'Y' && age < 65) { 11 // ルール列4 12 sale = "10%OFF"; 13}else if(coupon != 'Y' && weekday == 'Y' && age >= 65) { 14 // ルール列5 15 sale = "50%OFF"; 16}else if(coupon != 'Y' && weekday == 'Y' && age < 65) { 17 // ルール列6 18 sale = "30%OFF"; 19}else if(coupon != 'Y' && weekday != 'Y' && age >= 65) { 20 // ルール列7 21 sale = "割引なし"; 22}else if(coupon != 'Y' && weekday != 'Y' && age > 65) { 23 // ルール列8 24 sale = "割引なし"; 25}

上記がなぜ、単純なif文になるかわからないってことかな。

java

1if(weekday =='Y' && age >=65){ 2 sale="50%OFF"; 3} else if (weekday == 'Y'){ 4 sale ='30%OFF"; 5} else if (coupon == 'Y'){ 6 sale="10%OFF"; 7}

※2つ以上の割引サービスが重なった場合は、割引率が高い方が優先される。

なので、割引率の高い順に適用されるかを判定します。※ここが、わからない?(A)

50%の割引が適用されるルールは、列1と列5です。
if文で書くと

java

1if((coupon == 'Y' && weekday == 'Y' && age >= 65) || 2 (coupon != 'Y' && weekday == 'Y' && age >= 65)){

coupon は、Yでもそれ以外でも、50%の割引率になることがわかるので ※ここが、わからない?(B)

java

1if(weekday == 'Y' && age >= 65) {

だけ判定すれば良い。※ここが、わからない?(C)
50%の割引が適用されない場合、次に割引率が高いのは、30%なので、同様に ※ここが、わからない?(D)

java

1}else if((coupon == 'Y' && weekday == 'Y' && age < 65) || 2 (coupon != 'Y' && weekday == 'Y' && age < 65)) {

となります。
50%の割引のように考えると

java

1if(weekday == 'Y' && age < 65) {

と、なるのでは?と考えるかもしれませんが、(weekday == 'Y' && age >= 65)を事前にチェックしているので、
この分岐を通る場合 weekdayが'Y'でないか、age < 65 であるはずです。 ※ここが、わからない?(E)
※age < 65を書いてもよいですが不要な記述を一般的にはイヤがります
それであれば、weekdayがYかを判定すれば、ageの判定は不要です。
なぜかというと、
weekdayがYであれば、age < 65なので、30%の割引が適用される。(age >= 65 の場合、この分岐に入らない)
weekdayがYでなければ、10%の割引か、割引なし、なので次の割引率の判定を行う。

同様に、10%の割引を判定する場合、すでにweekdayの判定はしているので、
couponの判定のみ行えば10%割引か判定できます。※ここが、わからない?(F)

ちなみに、全部愚直に書いても問題があるわけではありません。


単純に仕様が理解できていないだけ?

➀クーポン持参:10%0ff

➁平日割引:30%off
➂平日シニア割引(65歳以上):50%off
※2つ以上の割引サービスが重なった場合は、割引率が高い方が優先される。

の場合、クーポン持参で、平日で、60歳の人の割引率がどれになるか、わからない?
10%offと50%offで、どちらが割引率が高いか、わからない?
10%と10%offを同じものだと思っている?

投稿2019/05/13 01:47

編集2019/05/14 12:17
momon-ga

総合スコア4820

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

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

0

これは数学の問題ではなく常識の問題ですね。なぜなら、問題を解決するにあたって重要な条件がありますが、それが書かれていません。書かなくてもわかるものと出題者は考えているんだと思います。

その条件とは、顧客は自らの利益が最大になることを望むというものです。

つまり、50% 割引と 30% 割引の両方の条件に合致する顧客は、必ず 50% 割引されることを望みます。平日にクーポン券を持ってきたシニアには 50% 割り引かなくてはならないのです。

この条件を満たすためには、最大の割引率から順に見ていって、適用されるところでストップします。

まず 50% 割引が適用されるかどうかを判定(その日が平日か、顧客がシニアか)し、合致すれば 50% 割引を適用します。

適用できなかった場合、次に 30% 割引が適用されるかどうかを調べ、適用されるならそれを適用します。

それもできなかった場合、10% 割引を判定し、それも適用できなかった場合には割引しません。

このように、ある条件に先立って別の条件を調べることを、条件に優先順位をつけると言います。

顧客にとって最大の利益となるよう優先順位をつけると、以下のようになります。

優先順位
50%off→平日で65歳以上
30%0ff→平日
10%→クーポン
なし→全て×

投稿2019/05/12 13:37

Zuishin

総合スコア28660

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

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

0

ベストアンサー

ちょーかんたんなお話じゃないですか。

➀クーポン持参:10%0ff

➁平日割引:30%off
➂平日シニア割引(65歳以上):50%off
※2つ以上の割引サービスが重なった場合は、割引率が高い方が優先される。

既に回答されている方もいますが、
お客さんは「お得」が大好きですし、店側も「お得」になるようにしてお客さんを呼びたいですよね

  • 平日で65歳以上のおじいちゃん、おばあちゃんの場合
平日:半額(50%OFF)
  • 平日でその他の若い人の場合
平日:30%OFF
  • 土日でクーポンをもっている場合(老若男女関係なし)
土日:10%OFF
  • 土日でクーポンを持っていない悲しい人の場合(老若男女関係なし)
土日:定価(割引なし)

お得(優先度が高い順)から考えればいいんです。
いきなり表やコードに起こさなくてもいいんです。

文章や絵や図など自分がわかりやすいように一度書き起こしてみるとよいです。

投稿2019/05/14 02:13

azuapricot

総合スコア2341

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

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

退会済みユーザー

退会済みユーザー

2019/05/19 15:03

頑固爺さん:平日半額?休日倍額じゃないのか?
guest

0

「2つ以上の割引サービスが重なった場合は、割引率が高い方が優先される」ということは、
例えば、「平日」で「クーポン持参」だとしても、割引率の高い「平日」の30%OFFが優先され、「クーポン持参」の分は考慮されなくなります。
言い方を変えれば、平日であれば、(シニアでなければ)クーポンがあろうがなかろうが30%OFFなので、クーポンの有無をチェックする必要がなくなるのです。
同様に、「平日シニア」であれば他の条件がどうあれ一番高い割引率50%OFFが適用されるため、他の条件をチェックするまでもなく50%OFFと確定できます。

投稿2019/05/12 07:25

swordone

総合スコア20651

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

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

r--

2019/05/12 13:21

r-h 2019/05/12 22:20 優先順位の組取り方含め(算数か数学で被る範囲を勉強し直す必要もありそうですが、それがどの範囲なのか分からないのです。)仕様から優先順位→なぜString sale="";から上と下で分けられるのかと、iif else文使うのかが思いつかないので、そういうときはどうしていたのでしょうか。 構文もそのまま覚えると言われたら、意味を理解せずに(動きの特性)入ってこないのです。
swordone

2019/05/12 13:52

もうちょっと日本語として読める文章にしてから投稿してください。全く理解できません。
guest

0

下のように書ける意味が分からない

すみません、何がどうわからないのでしょうか。「2つ以上の割引サービスが重なった場合は、割引率が高い方が優先される」ので、割引率の高い順に考えていけばいいだけです。

投稿2019/05/12 06:31

maisumakun

総合スコア145183

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

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

r--

2019/05/12 06:51

下のように書ける意味が分からないのと 優先順位 50%off→平日で65歳以上 30%0ff→平日 10%→クーポン なし→全て× String sale="";の上と下のコードの塊がパッと思い浮かばなく、 フローチャートが思い浮かばないのです。
maisumakun

2019/05/13 04:18

「下のように書ける意味が分からない」のは、「与えられた条件と下の条件が同じということが理解できない」のでしょうか、それとも「下の条件が単体で理解できない」ということでしょうか。
r--

2019/05/13 20:55

「与えられた条件と下の条件が同じということが理解できない」のが先です。デシジョンテーブルという(ここで他の回答者さんに教わったところから学びなおします。) 仕様から 優先順位(なにをどの順でするのか)が思いつけないのです。
maisumakun

2019/05/14 02:21

「割引率が高い方が優先される」という日本語が理解できないのでしょうか?
guest

0

このソースは意図した動作をしないと思います。

x if(Weekday =='Y'&&>=65){ O if(Weekday =='Y'&& age >=65){

難しく考えすぎでは

基本的に3種類の割引があり、優先順位が%が多き方なので、
%の大きいものからIF文で該当するかをチェックしています。

逆に混乱するかもしれませんが、ちがう表現だと比較する順番が遅いほど優先度がたかく sale を上書きします。

sale="割引なし"; if (coupon=='Y'){ sale="10%OFF"; } if (weekday=='Y'){ sale ='30%OFF"; } if(Weekday =='Y'&& age >=65){ sale="50%OFF"; }

投稿2019/05/13 04:09

編集2019/05/13 07:45
kamikaze.cappa

総合スコア558

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問