yumemizu5
@yumemizu5

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C++での入力処理のやり直し方法

Q&A

Closed

解決したいこと

ここに解決したい内容を記載してください。

1つ目のcinの処理後、2つ目のcinの処理の際に1つ目のcinの処理に戻りたい。
(入力間違え等で入力をし直す)
(2択で選択を間違えた際にやり直す等)

該当するソースコード

C++
cout << "5を入力してください\n";
cin >> a;

cout << "10を入力してください\n";
cin >> b;

//5入力時入力を間違えたため再入力したい
//上記は今回用の1例です。

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

C++ 入力ミス 処理戻し
C++ 処理戻し
C++ cin 入力し直し etc で検索したが見当たらなかった。

使用言語・ライブラリのバージョン

Visual Studio 2017
ツールセット Visual Studio 2017 (v141)
Windows SDK バージョン 8.1
C++言語標準 ISO C++17 標準 (/std:c++17)

0

8Answer

ロジック的な質問と捉えました。

シンプルに、期待値が入力されるまで繰り返す例です。
(数値以外の入力には対応していませんので、悪しからず)

#include <iostream>

using namespace std;

int main(void) {
    int a, b;

    while (true) {
        cout << "5を入力してください\n";
        cin >> a;

        cout << "10を入力してください\n";
        cin >> b;

        if (a == 5 && b == 10) {
            break;
        }
    }

    cout << "正常に入力されました\n";

    return 0;
}
1Like

質問がどこまで進んでいるのかを状態と解釈して管理するという方法が考えられます。 答えるたびに状態は更新されて次にすべき質問を指し示すという状態遷移の考え方です。

#include <iostream>

int main(void) {
    int progress = 1;  // 次にする質問はどれか
    int a, b;

    do {
        switch (progress) {
            case 1:
                std::cout << "方向を選択してください\n 右 : 1\n 左 : 2\n";
                std::cin >> a;
                progress = 2;  // 質問 1 が済んだら次は質問 2
                break;
            case 2:
                std::cout << "次の方向を選択してください\n 右 : 1\n 左 : 2\n 戻る : 3";
                std::cin >> b;
                if (b == 3)
                    progress = 1;  // 戻るを選択したら次は質問 1
                else
                    progress = 3;  // 質問 3 は無いが 3 を終了のフラグ (番兵) 扱いにする
                break;
        }
    } while (progress != 3);  // 終了状態になければループを回す

    std::cout << "a=" << a << "\nb=" << b << std::endl;
}

状態遷移図で書けばこういう感じです。

1Like

何が利用規約違反だったのかよくわかりませんが、書かれていた内容からして現在の位置(=状態)を持つことになるのかと思います。

すなわち、@SaitoAtsushi さんのコードがそれを体現しているかと思います。

いったん、手書きでもいいので、フローチャート(もしくはそれ相当のもの)を書いてみるとよいかもしれませんね。

1Like

ユーザが入力した指示に基づいて道を進むという状況を設定するなら過去の質問に戻るというだけでは足りないですね。 下図のような状況で「戻る」にしたときどこへ戻るべきかわかりません。

迷路1.png

同じ場所に至るにも違う経路をたどる可能性があるからです。

迷路2.png

つまり戻るためには今までの経路を記憶しておく必要があります。 現在の状態とスタック操作の組み合わせたものはプッシュダウン・オートマトンと呼ばれしばしば構文解析に活用されますが、質問の事例にも使えそうです。

1Like

ご回答ありがとうございます。

説明がわかりにくくて申し訳ないのですが

'''
cout << "方向を選択してください\n 右 : 1\n 左 : 2\n";
cin >> a;

//入力内容 : 1(右)を選択

cout << "次の方向を選択してください\n 右 : 1\n 左 : 2\n 戻る : 3";
cin >> b;

//2つ目の質問に入った段階で1つ目の入力が左だったことに気づいて処理を一個戻して再入力したい
//戻る : 3 のように選択しを追加して戻れるように作りたい

'''

説明力不足で申し訳ないです。

0Like

・aが1、bが1→???
・aが1、bが2→aの入力からやり直し
・aが1、bが3→aの入力からやり直し???

ってことですかね?うまく読み取れないのですが。特に一番上がよくわからないです。

0Like

'''
#include
using namespace std;

string A, B;

int main()
{
int a, b;

cout << "方向を選択してください\n 右 : 1\n 左 : 2\n";
cin >> a;

if (a == 1)
{
	A = "右に曲がる。";
}
else
{
	A = "左に曲がる。";
}

//入力内容 : 1(右)を選択

cout << "次の方向を選択してください\n 右 : 1\n 左 : 2\n 操作を1つ戻る : 3\n";
cin >> b;

if (b == 1)
{
	B = "右に曲がる。";
}
else if (b == 2)
{
	B = "左に曲がる。";
}
else
{
	//操作を一つ戻る何らかの処理
}

printf("一つ目の角を%s2つ目の角を%s\n\n\n", A.c_str(), B.c_str());

'''

上記のような何かを検討する用のプログラムを書く際に1つ目の指示をやり直したいというような意味合いです。

流れとして
1 1つ目の角を曲がる方向を指定してもらう。(今回は右を選択と仮定します。)
2 1と入力しAに"右に曲がる。"が代入されます。
3 2つ目の角を曲がる方向を指定してもらいます。
4 ここで1つ目の角は左に曲がるべきだったと気づきます。
5 この場合に 3(操作を1つ戻る)を選択すれば1つ目の角の時の処理に戻る。

上記の流れを作りたいです。

0Like

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌