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

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

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

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

Q&A

解決済

2回答

5312閲覧

一度処理したら一度カウントしたい

aiueo19

総合スコア19

Java

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

0グッド

2クリップ

投稿2017/11/22 08:08

編集2017/11/24 11:25

以下の英単語暗記プログラムを作成中なのですが
実行した際に

単語表示→単語の意味入力→正答判定→不正解なら同じ単語をもう一度、正解ならもう一度プログラムを実行し直すかどうかまでは完成し

実際に
「sincerely:敬具
正解
もう一度実行しますか 1.はい 2.いいえ
1
mature:」
のように動作します

そこで、例えばですが
「sincerely:敬具
正解
『5回目の正解です、』もう一度実行しますか 1.はい 2.いいえ
1
mature:」
のように、一度正解するたびにカウントさせるようにするには
どのようにコードを記述すればよいのか、どなたかご指導を賜れますでしょうか

現在、Javaの参考書、問題集、検索などをしているのですが、for文、while文など試しつつも、自分の力不足ゆえに思い通りにいかないのが現状です

追記:「思い通りにいかないとはどういった現象なのか質問に説明お願いします」との指摘がありましたので説明させていただきます
現在所有している参考書は「スッキリわかるJava入門」の『繰り返し構文のバリエーション』のページを読んでも「一度処理したら一度カウントする」ようなプログラムについては入門編だからか書かれておらず、所有している「Java8問題集500問」の繰り返し処理について書かれているページを見ても、「一度処理をしたら一度カウント」に該当するようなプログラムの例が見当たらず、「java 一度処理 一度カウント」で検索しても数字を条件式通りに繰り返すまでのプログラムの例しかでてこないため、調べれば自分の考えているプログラムの例が出てくるだろうと思い試したのですが、未だに出てこないため、思い通りにいかないという現象です。

よろしくお願い致します

lang

1import java.util.Random; 2import java.util.Scanner; 3 4public class EitangoAnki { 5 public static void main(String[] args) { 6 Random r = new Random(); 7 Scanner sc = new Scanner(System.in); 8 String[] meaN = {"敬具","大人になった" 9 }; 10 11 while(true) { 12 int wordNumber = r.nextInt(1); // 0〜1の乱数 13 14 String answer = meaN[wordNumber]; // 答えとなる文字列 15 16 String[] Word = {"sincerely","mature"}; 17 18 while(true) { 19 System.out.print(Word[wordNumber] + " : "); // 出題 20 String yourAns = sc.next(); // 解答を入力 21 22 if(yourAns.equals(answer)) { // 判定 23 System.out.println("正解"); 24 break; 25 } else { 26 System.out.println("不正解"); 27 } 28 } 29 30 31 System.out.println("もう一度実行しますか 1.はい 2.いいえ"); 32 if(!sc.next().equals("1")) { 33 break; 34 } 35 } 36 System.out.println("終了します"); 37 } 38 }

追記です:
現在、while文の中で
for文を使い、入力した答えと、予め用意されていた答えがtrueの場合、変数iにを1つ足すようにコードを追加してみたのですが

1枚目の画像のように、無限ループしてしまいます。

イメージ説明

そこで、1度処理をしたあと繰り返し自体を中断させるため、break;を記述すると

イメージ説明

2枚目の画像のように、下の「もう一度実行しますか〜〜」の処理がされず、延々と「0回目の正解です」→入力→「0回目の正解です」が繰り返され

i++がデッドコードとエラーが出てしまうところで躓いております。

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

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

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

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

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

m.ts10806

2017/11/22 08:16

「思い通りにいかない」というのは現在どのような現象が起きているのでしょうか。質問に追記願います。
aiueo19

2017/11/22 08:32 編集

現在所有している参考書は「スッキリわかるJava入門」の『繰り返し構文のバリエーション』のページを読んでも「一度処理したら一度カウントする」ようなプログラムについては入門編だからか書かれておらず、所有している「Java8問題集500問」の繰り返し処理について書かれているページを見ても、「一度処理をしたら一度カウント」に該当するようなプログラムの例が見当たらず、「java 一度処理 一度カウント」で検索しても数字を条件式通りに繰り返すまでのプログラムの例しかでてこないため、調べれば自分の考えているプログラムの例が出てくるだろうと思い試したのですが、未だに出てこないため、思い通りにいかないという現象です。
m.ts10806

2017/11/24 00:12

「質問に追記願います。」と書いたのですが・・・。こちらのコメントでは他の回答者の目につきにくいので質問に追記するようにしてください。
aiueo19

2017/11/24 00:46

了解しました、ご指摘ありがとうございます。
LouiS0616

2017/11/24 01:03

画像のリンクが切れてしまっているので、お手数ですがもう一度貼りなおしていただきますようお願いします。
aiueo19

2017/11/24 01:07 編集

了解しました。 申し訳ありませんが、現在外出中のためしばらくお待ちいただけると幸いです。 ご指摘ありがとうございます。
LouiS0616

2017/11/24 01:06

また、aiueo19さんご自身は、画像のように無限ループが生じたりカウントが増えなかったりする理由について心当たりは全くありませんか。
aiueo19

2017/11/24 11:41 編集

お返事が遅れてすみません、1枚目の画像で無限ループが生じる理由は、恐らく24行目の拡張for文にbreak;がないため、拡張for文内にある条件の「yourAns.equals(answer) 」←(質問に正解した時true)この条件が常にtrueになっているのと、break;がないため処理が無限ループされてしまうのではないかと思います。カウントが増えない理由は、知識不足のためわかりません・・・すみません。現在調べながら格闘しております・・・。
guest

回答2

0

ベストアンサー

こんな感じでしょうか。

Java

1for(int numOfCorrect = 1; true; numOfCorrect++) { 2 ... 3 while(true) { 4 ... 5 } 6 7 System.out.println(numOfCorrect + "回目の正解です"); 8 ... 9}

追記のコードが上手くいかない理由

Java

1for(int i = 0; yourAns.equals(answer); i++) { 2 System.out.println(i + "回目の正解です"); 3}

for文は、for(初期化部; 条件式; 更新式)という形式で書きます。
上記のコードでは、ループ内において条件式の判定が変わるような影響がありません。
よって、無限ループとなり、iはカウントアップされ続けます。


Java

1for(int i = 0; yourAns.equals(answer); i++) { 2 System.out.println(i + "回目の正解です"); 3 break; 4}

上記のコードでは、breakが無条件に実行され、ループが二周以上することはありません。
i++に警告が出るのは、ループが必ず一周で終わるため、更新式が用いられないからです。
通常break文やcontinue文は、何らかの条件付きで記述します。

また、上記for文に突入する際は、毎度iが0に初期化されます。
よって、何度実行しても『0回目の正解です』としか表示され得ません。

私が示した解法について

回答冒頭のコードについてです。
aiueo19さんの元のコードの、次の構造を利用しています。

外側のループ { ... 内側のループ { ... 正解したら脱出 } 正解した回数を表示(したい) ... }

要するに、『外側のループを繰り返した回数 = 正解した回数』なのです。
ループを実現するにはfor文とwhile文があります。
これらは相互代替可能ですが、ここではfor文の
カウンタ
を利用しています。

よって、次のように書きました。(冒頭のコードと全く同じ内容です)

Java

1for(int numOfCorrect = 1; true; numOfCorrect++) { 2 ... 3 while(true) { 4 ... 5 } 6 7 System.out.println(numOfCorrect + "回目の正解です"); 8 ... 9}

ループを新しく内側に入れ込んだりする必要はありません。
単に、外側のループをfor文に置き換えれば万事解決するのです。

プログラムの書き方について

かなりいろいろと調べ、奮闘されているようですね。これ自体は、とても大切なことです。
ただ、今回のコードは、for文の基本的な使い方がわかっていれば問題なく解決できるはずです。
ですので、基本的な部分を確認するように申し上げました。

スラスラとコードを書くのには慣れが必要です。
基本的な部分を、不足なくしっかり押さえ、コードの挙動を追う癖をつけてください。

投稿2017/11/22 08:17

編集2017/11/24 11:55
LouiS0616

総合スコア35660

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

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

aiueo19

2017/11/22 08:28

お早いご回答をありがとうございます、助かります 早速試させてもらいます
LouiS0616

2017/11/22 09:58

追記を見させていただきましたが、私の回答は『for文を増やせ』という意味ではありません。 外側のループをfor文に置き換えるという意味です。 ループの挙動が理解できていれば、そんなに悩む件でもないです。 追記されているコードも、そりゃ思い通りにいかないよ、という内容です。 for文やwhile文がどのような働きを持っているのか、もう一度確認してください。
aiueo19

2017/11/22 10:02

お早いお返事をありがとうございます。 助言助かります、承知しました、今すぐ復習して参ります。
LouiS0616

2017/11/24 11:57

上記やり取りからの引用失礼します。 『お返事が遅れてすみません、1枚目の画像で無限ループが生じる理由は、恐らく24行目の拡張for文にbreak;がないため、拡張for文内にある条件の「yourAns.equals(answer) 」←(質問に正解した時true)この条件が常にtrueになっているのと、break;がないため処理が無限ループされてしまうのではないかと思います。カウントが増えない理由は、知識不足のためわかりません・・・すみません。現在調べながら格闘しております・・・。』
LouiS0616

2017/11/24 12:00 編集

無限ループが生じる理由はご推察の通りですが、breakを使わない解決策をまず求めたいところです。 また、『カウントが増えない理由』と書いていますが、実際にはカウンタは『増えていない』のではなく、それぞれ別個に存在しています。 詳しくは回答本文をご覧ください。
aiueo19

2017/11/24 12:31

さきほどLouiS0616さんの解説を読みながら、言われた通り外側のループをfor文にし for文内にSystem.out.println(num0fCorrect + "回目の正解です"); としたところ、あっさりと思い通りに動作したため、感動してしまいした。 正常に動作することができたのも、自分の抱えている疑問点を追記で参考書並みに丁寧に教えてくださり、解消していただいたLouiS0616さんのおかげ、の一言に尽きます。 詳しくご教示くださり、誠にありがとうございました!
aiueo19

2017/11/24 12:33

>『カウントが増えない理由』と書いていますが、実際にはカウンタは『増えていない』のではなく、それぞれ別個に存在しています。 詳しくは回答本文をご覧ください。 目から鱗の連続で、とてもわかりやすかったです、本当にありがとうございました。
LouiS0616

2017/11/24 13:31 編集

プログラムは理解しているだけでは書けませんし、一方書いているだけでは理解は不足します。 学ぶこと・試すこと、この二つのバランスが非常に重要だと思っています。 学んでいてつまったときは、可能な限りそれを試しましょう。 また、コーディングにつまったときは、基礎的な知識を確認しましょう。 人によって得意不得意はもちろんありますが、プログラムは言語ですから、時間がかかっても誰もが一通り習得できると思います。頑張ってくださいね。 一人の力ではどうしても解決出来ない際は、またご質問ください。
aiueo19

2017/11/25 06:47

なるほど、学ぶ事と試す事を両立する事が大事なんですね。 わかりました、地道に頑張ります。 またお力添えが必要になった際には、ご質問させていただきます。 その時は何卒よろしくお願い致します。 ありがとうございました。
guest

0

あらかじめint c = 0;とか定義しておいて、
System.out.println("正解");
の下でインクリメントすればいいんじゃないでしょうか。

投稿2017/11/22 08:18

ka_ei

総合スコア207

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

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

aiueo19

2017/11/22 10:02

ご回答をありがとうございます、参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問