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

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

ただいまの
回答率

91.36%

  • Java

    10465questions

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

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

解決済

回答 2

投稿 2017/11/22 17:08 ・編集 2017/11/24 20:25

  • 評価
  • クリップ 0
  • VIEW 107

aiueo19

score 7

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

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

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

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

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

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

よろしくお願い致します

import java.util.Random;
import java.util.Scanner;

public class EitangoAnki {
        public static void main(String[] args) {
            Random r = new Random();
            Scanner sc = new Scanner(System.in);
            String[] meaN = {"敬具","大人になった"
            };

            while(true) {
                int wordNumber = r.nextInt(1); // 0〜1の乱数

                String answer = meaN[wordNumber]; // 答えとなる文字列

                String[] Word = {"sincerely","mature"};

                while(true) {
                    System.out.print(Word[wordNumber] + " : "); // 出題
                    String yourAns = sc.next(); // 解答を入力

                    if(yourAns.equals(answer)) { // 判定
                        System.out.println("正解");
                        break;
                    } else {
                        System.out.println("不正解");
                    }  
                }


                System.out.println("もう一度実行しますか 1.はい 2.いいえ");
                if(!sc.next().equals("1")) {
                    break;
                }
            }
            System.out.println("終了します");
        }
    }

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

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

イメージ説明

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

イメージ説明

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • aiueo19

    2017/11/24 10:07 編集

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

    キャンセル

  • LouiS0616

    2017/11/24 10:06

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

    キャンセル

  • aiueo19

    2017/11/24 20:41 編集

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

    キャンセル

回答 2

checkベストアンサー

+3

こんな感じでしょうか。

for(int numOfCorrect = 1; true; numOfCorrect++) {
   ...
   while(true) {
       ...
   }

   System.out.println(numOfCorrect + "回目の正解です");
   ...
}

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

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

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


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

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

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

私が示した解法について

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

外側のループ {
   ...
   内側のループ {
       ...
       正解したら脱出
   }

   正解した回数を表示(したい)
   ...
}

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

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

for(int numOfCorrect = 1; true; numOfCorrect++) {
   ...
   while(true) {
       ...
   }

   System.out.println(numOfCorrect + "回目の正解です");
   ...
}

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

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

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

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

投稿 2017/11/22 17:17

編集 2017/11/24 20:55

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/22 17:28

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

    キャンセル

  • 2017/11/22 18:58

    追記を見させていただきましたが、私の回答は『for文を増やせ』という意味ではありません。
    外側のループをfor文に置き換えるという意味です。

    ループの挙動が理解できていれば、そんなに悩む件でもないです。
    追記されているコードも、そりゃ思い通りにいかないよ、という内容です。
    for文やwhile文がどのような働きを持っているのか、もう一度確認してください。

    キャンセル

  • 2017/11/22 19:02

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

    キャンセル

  • 2017/11/24 20:57

    上記やり取りからの引用失礼します。

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

    キャンセル

  • 2017/11/24 21:00 編集

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

    キャンセル

  • 2017/11/24 21:31

    さきほどLouiS0616さんの解説を読みながら、言われた通り外側のループをfor文にし
    for文内にSystem.out.println(num0fCorrect + "回目の正解です");
    としたところ、あっさりと思い通りに動作したため、感動してしまいした。

    正常に動作することができたのも、自分の抱えている疑問点を追記で参考書並みに丁寧に教えてくださり、解消していただいたLouiS0616さんのおかげ、の一言に尽きます。

    詳しくご教示くださり、誠にありがとうございました!

    キャンセル

  • 2017/11/24 21:33

    >『カウントが増えない理由』と書いていますが、実際にはカウンタは『増えていない』のではなく、それぞれ別個に存在しています。
    詳しくは回答本文をご覧ください。

    目から鱗の連続で、とてもわかりやすかったです、本当にありがとうございました。

    キャンセル

  • 2017/11/24 22:31 編集

    プログラムは理解しているだけでは書けませんし、一方書いているだけでは理解は不足します。
    学ぶこと・試すこと、この二つのバランスが非常に重要だと思っています。
    学んでいてつまったときは、可能な限りそれを試しましょう。
    また、コーディングにつまったときは、基礎的な知識を確認しましょう。

    人によって得意不得意はもちろんありますが、プログラムは言語ですから、時間がかかっても誰もが一通り習得できると思います。頑張ってくださいね。
    一人の力ではどうしても解決出来ない際は、またご質問ください。

    キャンセル

  • 2017/11/25 15:47

    なるほど、学ぶ事と試す事を両立する事が大事なんですね。

    わかりました、地道に頑張ります。
    またお力添えが必要になった際には、ご質問させていただきます。
    その時は何卒よろしくお願い致します。
    ありがとうございました。

    キャンセル

+1

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

投稿 2017/11/22 17:18

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/22 19:02

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

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

  • 解決済

    javaで作れる学習プログラムってどのようなものが作れますか

    意図 javaを使って学習プログラムを作成してほしいといわれました。 しかし、イメージがわきません。 どんなものが作れるのでしょうか

  • 解決済

    int[] の戻り値がないといわれる

    public static int[] userWrite() throws IOException { System.out.println("数字を入力してくだ

  • 解決済

    Java javaプログラムから他のjavaプログラムを実行

    C:\pleiades\workspace\Command\srcにある 実行するとaとSystem.out.println("a");と実行するa.javaプログラムがあり これ

  • 解決済

    java replaceでcharが文字化けする

    前提・実現したいこと int型の数値をchar型にキャストし、それを二番目の引数にしてreplaceをした文字列が文字化けしてしまう問題が発生しました。 該当のソースコード

  • 解決済

    javaの2重ループ

    前提・実現したいこと javaで1~15まで1づつカウントアップした数字を並べ、 実行する時のargs[0]の値で改行したい。 それを2重ループで書きたい。 args[

  • 受付中

    ジャンケンゲーム

    ジャンケンゲームを作ってます。 <ルール> コンピュータに3回負けたらゲーム終了! 負けるまでゲームは続く! 数字を入力するとループが止まりません。 あと、winlo

  • 解決済

    java キーボード入力を用いた計算プログラム

    概要 キーボードから入力したテストの結果から、合計・平均・順位(バブルソート)分散・標準偏差を導出するプログラムを作っています。 具体的には 生徒数を入力 ↓ 生徒数の応じた点数を

  • 解決済

    Java初心者・ 配列について

    質問 4 5    //行の数と列の数 2 5 2 43 34 34 4 43 24 19 4 9 -3 4 4 12 43 34 -35 43 上記のような表が入力されたとし

同じタグがついた質問を見る

  • Java

    10465questions

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