0

次のコードを見てください

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
    enum Movement{STAND,WALK,RUN,CRAWL};

    Movement state = (Movement)(1+rand()%4);

    for(int i=0;i<100;i++)
    {

    cout << state << endl;

    switch(state)
    {
        case STAND: 
            cout << "You can walk or crawl" << endl;        
            while(state==WALK || state==CRAWL){
            state = (Movement)(1+rand()%4);}
            break;


        case WALK: 
            cout << "You can stand or run" << endl;
            while(state==STAND || state==RUN){
            state = (Movement)(1+rand()%4);}
            break;


        case RUN: 
            cout << "You can walk" << endl;
            while(state==WALK){
            state = (Movement)(1+rand()%4);}
            break;

        default: 
            cout << "You can stand" << endl;
            while(state==STAND){
            state = (Movement)(1+rand()%4);}

    }

    }
}

ここにはいくつかのルールがあります。それらを法的移行と呼びましょう

  1. スタンドから、彼は歩いたりハイハイしたりできます
  2. ウォークから、彼は立ったり走ったりできます
  3. ランから、彼は歩くことができます
  4. クロールから、彼は立つことができます

したがって、ここでは、合法的な遷移をランダムに選択する必要があります。ただし、上記のルールに従う必要があります。例えば「STAND」を選択した場合、次に選択するのは「WALK」か「CRAWL」となります。しかし、ここでわかるように、すべての結果は

2
You can walk

何故ですか?助けてください!

アップデート:

返信で提案されているように、次のコードは do..while ループを使用しています

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
    enum Movement{STAND,WALK,RUN,CRAWL};

    Movement state = (Movement)(1+rand()%4);

    for(int i=0;i<10;i++)
    {

    cout << state;

    if(state==STAND)
    {
        cout << " STAND is selected" << endl;

    }
    else if(state==WALK)
    {
        cout << " WALK is selected" << endl;

    }
    else if(state==RUN)
    {
        cout << " RUN is selected" << endl;
    }
    else if(state==CRAWL)
    {
        cout << " CRAWL is selected" << endl;
    }

    switch(state)
    {
        case STAND: 
            //cout << "You can walk or crawl" << endl;        
            do{state = (Movement)(rand()%4);}
            while(state==WALK || state==CRAWL);

            break;


        case WALK: 
            //cout << "You can stand or run" << endl;
            do{state = (Movement)(rand()%4);}
            while(state==STAND || state==RUN);
            break;


        case RUN: 
            //cout << "You can walk" << endl;
            do{state = (Movement)(rand()%4);}
            while(state==WALK);
            break;

        default: 
            //cout << "You can stand" << endl;
            do{state = (Movement)(rand()%4);}
            while(state==STAND);

    }

    }
}

それは今でも同じです。今、私はさまざまな答えを得ましたが、正しいものではありません!!

4

2 に答える 2

1

C および C++ では、列挙型はデフォルトで 0 から始まります。

于 2012-11-17T06:01:30.520 に答える
1

ロジックの順序が間違っています。特定の を入力したときのままであるため、whileループはすべてスキップされます。で書き直して、少なくとも 1 回は実行されるようにすることができます。statecasedo-while

于 2012-11-17T06:02:28.503 に答える