2016-07-03 2 views
-1

説明: すべての文字に異なる数字があるように、ランダムな数字を単語に割り当てる必要があります。便宜上、別々の1文字変数の代わりに配列を使用しました。このように私は "abc [1]"は単語 "abc"からの文字 'b'であることを知っています。単語の最初の数は、私は数字が真にランダムではないことを認識しています「075」のような数字を避けるためにDo ... whileループの予期しない動作

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int abc[2]; 
int def[2]; 

void setRandom() 
{ 
    abc[0] = rand() %9+1; 
    do {abc[1] = rand() %10;} while (abc[1] == abc[0]); 
    do {abc[2] = rand() %10;} while (abc[2] == abc[1] || abc[2] == abc[0]); 

    printf("RANDOM abc %d %d %d", abc[0], abc[1], abc[2]); //printed just fine. 

    do {def[0] = rand() % 9 +1; } while (def[0] == abc[2] || def[0] == abc[1] || def[0] == abc[0]); //code seems to be stuck here 
    do {def[1] = rand() %10;} while (def[1] == def[0] || def[1] == abc[2] || def[1] == abc[1] || def[1] == abc[0]); 
    do {def[2] = rand() %10;} while (def[2] == def[1] || def[2] == def[0] || def[2] == abc[2] || def[2] == abc[1] || def[2] == abc[0]); 

    printf("RANDOM def %d %d %d", def[0], def[1], def[2]); //THIS CODE IS NEVER REACHED. WHY? 
} 

int main() 
{ 
    setRandom(); 
    printf("RANDOM SET"); 
} 

を別の範囲を使用しています。私はコードが乱雑であることを認識しています。私はそれがブルートフォースの数字には非効率的だと認識しています。私は数字を設定するこの方法が悪いことを知っていますが、何か良いことは考えられませんでした。このコードは私の目的のために仕事をします。

問題は、上記のコードがdef [0]の番号を生成している間にスタックしてしまうことです。それは無限に新しい乱数を生成しますが、ループの一部分を完全に無視しているようです。

私がやろうとしていることを実行するためのより良い方法を提案するか、単に問題の解決方法を提案するか、プロジェクトが大きなものではないので、どちらかといえばうまくいくでしょう、それは単にパズルソルバーとして使用されます。

+0

を割り当てるように、 '[1]'、 '[0] [0]' ABC '対あなたがデフ'の値を検査しようとしたことがあり、ABCをあなたのコードを修正し、 'abc [2]'? –

+0

単一の配列を使用して、おそらく別の関数を使用して比較チェックを試してみてください。 –

+1

あなたのコードはC99ではなく、(本物ではありません)C++ 11です。それから、コンパイル時に 'gcc -Wall -g'を使うよりも、すべての警告とデバッグ情報([GCC](http://gcc.gnu.org/)を使用している場合)をコンパイルしてください。警告。次に**デバッガ**を使用します(例: 'gdb')。あなたのfix-my-codeリクエストはここで話題にはなりません。 –

答えて

1

C/C++の配列はゼロベースです。 abc[2]を作成すると、0と1だけが合法的にアクセスできます。配列の最後を超えるものは未定義の動作です。この場合、abc[2]第3要素、第2要素ではない)がdef[0]を指している可能性があります。

両方の宣言は、3つの要素の代わりに、2

2

問題は、配列に間違ったサイズを選択したことです。 def[0]abc[2]は、おそらく同じ場所を指している可能性があります。

特に、サイズ2の配列を作成してから、3つの要素にアクセスします。変更:

int abc[2]; 
int def[2]; 

へ:

int abc[3]; 
int def[3]; 

は、あなたが何をしようとして行うには良い方法へとthis answerも参照してください。

関連する問題