0

私は、ユーザーに一連の質問を求めるコンソールベースのアプリケーションを作成しています。例えば:

「開くレコードを入力してください:」

「Xをやりたいですか?」

「Yをしたいですか?」

「続行してもよろしいですか?」

ユーザーがプロンプトで何も入力しない場合は、1レベル上に移動します。これはgotoを使用すると簡単です。私が考えることができる他の唯一の方法は、はるかに醜く見え、2、3以上のプロンプトに対してかなり扱いにくいforループにネストされています。これを行う簡単な方法があるはずですが、私はそれを考えることができません。

4

3 に答える 3

1

繰り返しではなく再帰的に記述します。

于 2010-08-24T01:53:38.087 に答える
1

あなたは基本的に非常に単純なステートマシンを書いています-すべての状態を表すために関数を使用してください:(言語を指定しなかったので、ランダムな擬似コードを使用します)

get_information():
    return get_record()

ask_record():
    record = read_line()
    return () if !record
    return ask_y(record)

ask_x(record):
    x = read_line()
    return ask_record() if !x
    return ask_y(record, x)

ask_y(record, x):
    y = read_line()
    return ask_x(record) if !y
    return ask_continue(record, x, y)

ask_continue(record, x, y)
    continue = read_line()
    return ask_y(record, x) if !continue
    return (record, x, y)

これは些細なアプローチです。一部の言語では、コールスタックが増加しますが、他の言語では増加しません。スタックを成長させる言語がある場合は、次のように書き直すことで、トランポリンを使用してスタックを防ぐことができますget_information

x = get_information
while x is function:
    x=x()
return x

ask_x(record):
    x = read_line()
    return (lambda: ask_record()) if !x
    return (lambda: ask_y(record, x))

または、結果の質問とメモリアドレスを抽象化することで、次のようquestionな構造になります。

struct question {
    question *next, *prev;
    char prompt[];
    char **result;
}

次に、ループで実行し、呼び出しquestion* run_question(question*)て、答えに応じて-> next、または-> prevに移動し、結果がNULLになるまで(結果が入力されて質問が残っていない場合の停止条件として)。

直接ポインタアクセスで命令型言語を使用する場合、最後の解決策はおそらく最も「通常の解決策」です。

于 2010-08-24T02:06:59.290 に答える
1

単純なステートマシンとして記述します。

while(running)
{
    if (state == INIT)
    {
        out("enter record");
        state = DO_X;
    }
    else if (state == DO_X)
    {
        do whatever for x.
        state = WHATEVER_NEXT_STATE_IS;
    }
}
于 2010-08-24T02:36:18.993 に答える