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

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

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

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

Q&A

1回答

5541閲覧

他メソッドにwhile文のbreakやcontinueを渡す方法

ksk_2200

総合スコア8

Java

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

0グッド

0クリップ

投稿2017/09/01 03:04

先日の質問ではここでお世話になりました。
銀行の簡単なプログラムを作っています。
入金、出金、振込と選択肢を与えて、各処理を終わったら利用確認メソッドが呼び出されはい、なら最初から、いいえなら、終了アナウンスを一連の流れとするプログラムを作っています。
出金など3つの選択肢はLiquid_valueクラスのインスタンスを生成しています。
質問なのですが利用確認メソッド(サブメソッド)にメインメソッドのwhile文の結果、はいなら続けるためメインメソッドにcontinueを渡し、いいえならBreakを渡したいのですが、スコープの関係からかまず利用確認メソッドに読み込むことができません。
なにかいい案はございませんでしょうか。

Java

1 2 3public class Liquid_value { 4 5 6 private int ny; 7 //コンストラクタ 8 public Liquid_value (int nm){ 9 this.ny=nm; 10 } 11 public int getNy() { 12 return ny; 13 } 14 15 public void setNy(int ny) { 16 this.ny = ny; 17 } 18 19 } 20 21 22 23 24

java

1 2 import java.util.Scanner; 3 4 public class Bank_main { 5 6 7 public static void Main(String[]args){ 8 int cv=0; 9 while(true) { 10 System.out.println("ご利用ありがとうございます。どちらをご利用されますか?現在の残高は"+cv+"円です。"); 11 System.out.print("1:入金 2:出金 3:振込"); 12 //if(cv>=300000) { 13 //System.out.print(" 4:投資信託"); 14 //} 15 //if(cv<0) { 16 //System.out.println("警告 債務が発生しています。ご注意ください。"); 17 18 19 20 int input=new Scanner(System.in).nextInt(); 21 if(input==1){ 22 System.out.println("入金金額を入力してください。"); 23 24 Liquid_value n=new Liquid_value(new Scanner(System.in).nextInt()); 25 26 System.out.println("残高"+cv+"円に"+n.getNy()+"円入金しました。"); 27 cv+=(n.getNy()); 28 confi(); 29 }if(input==2){ 30 System.out.println("出金金額を入力してください。"); 31 32 Liquid_value s=new Liquid_value(new Scanner(System.in).nextInt()); 33 34 System.out.println("残高"+cv+"円から"+s.getNy()+"円出金しました。"); 35 cv-=(s.getNy()); 36 37 38 }if(input==3){ 39 System.out.println("振込金額を入力してください。"); 40 41 Liquid_value h=new Liquid_value(new Scanner(System.in).nextInt()); 42 System.out.println("振込先を選択してください"); 43 44 String com1="株式会社kanazawa"; 45 String com2="株式会社 奎祐"; 46 System.out.println("1:"+com1+"2:"+com2); 47 int in=new Scanner(System.in).nextInt(); 48 String r; 49 if(in==1) { 50 r=com1; 51 if(in==2) { 52 r=com2; 53 } 54 55 System.out.println(r+"にあなたの口座残高"+cv+"円から"+h.getNy()+"円出金しました。"); 56 57 cv-=(h.getNy()); 58 59 //if(input==4){ 60 //Sintku s=new Sintaku("こんにちは"); 61 //try { 62 //s.start(); 63 64 }else if(input>4){//ほんとは5 65 System.out.println("正しい数字が入力されていません。"); 66 67 break; 68 69 //} 70 71 } 72 } 73 } 74 } 75 public static void confi(){ 76 System.out.println("続けてご利用になられますか?"); 77 System.out.println("1:はい 2:いいえ"); 78 int ui=new Scanner(System.in).nextInt(); 79 if(ui==1) { 80 continue; 81 82 }if(ui==2) { 83 84 System.out.println("ご利用ありがとうございました。"); 85 System.out.println("またのご利用お待ちしています。"); 86 break; 87 88 }else { 89 System.out.println("正しい数字が入力されていません"); 90 } 91 } 92 } 93 94 95 96 97 98 // TODO 自動生成されたメソッド・スタブ 99 100 101 102 103 104 105 106 107

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

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

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

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

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

guest

回答1

0

こういう設計にすればよいのでは。

Java

1public static boolean conf() { 2 System.out.println("続けてご利用になられますか?"); 3 System.out.println("1:はい 2:いいえ"); 4 5 // 本当はScannerのインスタンスはフィールドにすることが望ましい 6 int ui = new Scanner(System.in).nextInt(); 7 if(ui == 1) { 8 return true; 9 } 10 if(ui == 2) { 11 System.out.println("ご利用ありがとうございました。"); 12 System.out.println("またのご利用お待ちしています。"); 13 return false; 14 } 15 /* 16 else { 17 System.out.println("正しい数字が入力されていません"); 18 挙動が不明 19 } 20 */ 21}

呼び出し側は、do-whileでこいつを参照すればよいです。

Java

1do { 2 /* 3 色んな処理 4 */ 5} while(conf());

プログラムに気になる点が多くあります。
0. クラス名の表記が一般的でない
Bank_mainではなくBankMainの方が一般的な表記(PascalCase)かと思います。
0. Liquid_valueの存在意義が謎
何のためのクラスかわかりません。フィールドをprivateにしている意味もありません。
0. Scannerのインスタンスを作りすぎ
クラス内で一つだけ生成して使いまわせばよいのでは。
0. 定数の宣言が散らばっている
例えば株式会社名。フィールドとして保持する方が自然ですし、拡張も容易です。
0. staticメソッド内でいろいろやりすぎ
mainメソッドが尋常じゃないボリュームになっています。
0. if文の濫用が目立つ
排他的な条件ならelse-if文を適宜用いるか、switch文を利用するべきかと。
0. 変数やクラスの役割が不明瞭
Liquid_valueが最たるものですが、cvとかrとかhとかって何でしょう。
0. インデントが揃っていない
読みづらいですし、同時に書きづらいでしょう?他の人のコードをまねてみましょう。

基礎的な部分をしっかり押さえることをお勧めします。


銀行のプログラムって言ったら、こんな感じかな?口座クラスを適当に作ってみました。

Java

1import java.util.ArrayList; 2import java.util.List; 3 4public class Kouza { 5 private String name_; 6 private int zandaka_ = 0; 7 private List<String> suitou_ = new ArrayList<>(); 8 9 public Kouza(String name) { 10 this.name_ = name; 11 } 12 13 public String getName() { 14 return name_; 15 } 16 public int getZandaka() { 17 return zandaka_; 18 } 19 public void nyukin(int money) { 20 kichou(money + "円入金しました。"); 21 setZandaka(getZandaka() + money); 22 } 23 public void shukkin(int money) { 24 kichou(money + "円出金しました。"); 25 setZandaka(getZandaka() - money); 26 } 27 28 // 29 // private 30 private void setZandaka(int money) { 31 zandaka_ = money; 32 } 33 private void kichou(String naiyou) { 34 suitou_.add(naiyou); 35 } 36}

即興なのでかなり荒っぽいです(特に命名)。あとめんどくさそうな機能の実装は避けました。
setZandaka()など、自在にアクセスされたくないメソッドをprivateにしているのがミソです。

投稿2017/09/01 03:18

編集2017/09/01 04:13
LouiS0616

総合スコア35658

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

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

ksk_2200

2017/09/01 07:02

細かにご指摘ありがとうございます。 非常に参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問