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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

173閲覧

繰り返しの中に繰り返しを入れる方法

Tazusa

総合スコア41

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2018/03/01 14:27

正の整数aを入力し、0までカウントダウンするプログラムを作っています。ただし、入力された数が11以上なら本当に実行するか聞きます。
本当に実行するなら変数xに1、しないなら0を入力するように促します。

問題は、①xに0が入力されたときと、②x以外の数が入力されたときの対応です。
どちらの場合ももう一度aを入力させるようにさせ、同じように11以上なら実行するか尋ね、xに入力するように促したいです。
このように繰り返しの中にさらに繰り返しを入れるようにしたいのですが、どのように書けばよいのでしょうか。
コピーして同じものを貼るのでは、結局無限に貼らなくてはならないのではないかと考えて、行き詰ってしまいました。

以下に自分で書いたコードを貼ります。

import java.util.Scanner; public class system03 { public static void main(String[] args) { Scanner stdIn = new Scanner (System.in); System.out.println("正の整数A"); int a = stdIn.nextInt(); while (a < 0) { System.out.println("正の整数を入力"); a = stdIn.nextInt(); } int x; while (a >10) { System.out.println("値が大きいですが本当にしますか?するなら1、しないなら0"); x = stdIn.nextInt(); if (x ==1) break; else if (x ==0) { } else { } } do { System.out.println(a); a = a - 1; }while(a >= 0); } }

どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ループを重ねる(ネストする)方法もありですが、プログラムが複雑になります。
適当にメソッドに切り出すとすっきりしますよ。

例えば、こんな感じで。

Java

1import java.util.Scanner; 2 3class Main { 4 private static int inputNatural() { 5 try(Scanner stdIn = new Scanner(System.in)) { 6 while(true) { 7 System.out.println("正の整数を入力してください: "); 8 int num = Integer.parseInt(stdIn.nextLine()); 9 10 if(num < 0 ) continue; 11 if(num < 10) return num; 12 13 System.out.println("値が大きいですがよろしいですか?Yes:1/No:0"); 14 if(Integer.parseInt(stdIn.nextLine()) == 1) { 15 return num; 16 } 17 } 18 } 19 } 20 21 public static void main(String[] args) { 22 int num = inputNatural(); 23 for(int i = num; i >= 0; --i) { 24 System.out.println(i); 25 } 26 } 27}

投稿2018/03/01 14:42

LouiS0616

総合スコア35660

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

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

Tazusa

2018/03/02 10:59 編集

ありがとうございます。 一つInteger.parseInt(stdIn.nextLine());の部分について質問があります。 Integer.parseInt(stdIn.nextLine());を調べると数字列をInt型数値に変換するというようなことでしたが、なぜあえてただの入力ではなく、この表現にされたのでしょうか。
LouiS0616

2018/03/02 11:39

nextIntでも動作しますよ。 ただ、こいつはけっこう癖があって、適切に使わないと解消しづらいエラーのもとになります。 https://qiita.com/wing-x/items/187e988125a3bd7b2b32 ですので、明示的に一行まるまる読み取ってパースした方が楽なのです。
Tazusa

2018/03/02 13:00

リンク先拝見しました。よく理解せずとりあえずnextInt();やnextLine();を使っていたのでとても勉強になります。ありがとうございました。
Tazusa

2018/03/02 13:06

すみません、もう一つありました。try(Scanner stdIn = new Scanner(System.in))はどのような意味で書かれているのでしょうか。入門書でtryにではcatchが必要と学んだのですが...
LouiS0616

2018/03/02 13:16 編集

try-with-resourceと呼ばれるもので、確保したリソースを安全に解放できる機能です。 非常に便利な記法なのですが、わりあい新しいので教科書によっては扱っていないかもしれません。(とはいえ、登場からもう7年たっているのですが。) --- 実はScannerインスタンスを生成した場合、使い終わったときにリソースを解放してやるのがお行儀が良いです。『リソースを解放』と言うと小難しいですが、Scanner#closeを呼べば良いだけです。 しかし、うっかり解放し忘れたり、 予期せぬ例外が発生して解放がスキップされたりしてしまう恐れがあります。 ですので、Scanner#closeの代わりに積極的にtry-with-resource文を用いるのが良いでしょう。
LouiS0616

2018/03/03 05:50 編集

一般的なtry文にcatch文が付随すべき、と言うのはおっしゃる通りです。
Tazusa

2018/03/03 05:47

try-with-resourceは聞いたことはありましたが、頭の中でこのケースと結びついていなかったです。 また勉強を続けたいと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問