0

これはディールまたはノーディール ゲーム用です。

したがって、メイン関数では、casesort メソッドを次のように呼び出しています。

casesort(cases);

私の方法は次のようになります。これが最も効率的な並べ替えではないことはすでにわかっていますが、知っていることを使用します。

void casesort(float cases[10])
{
int i;
int j;
float tmp;
float zero = 0.00;

for (i = 0; i < 10; i++)
{
    for (j = 0; j < 10; j++)
    {
        if (cases[i] < cases[j])
        {
            tmp = cases[i];
            cases[i] = cases[j];
            cases[j] = tmp;
        }
    }
}

//Print out box money amounts
printf("\n\nHidden Amounts: ");
for (i = 0; i < 10; i++)
{
    if (cases[i] != zero)
        printf("[$%.2f] ", cases[i]);
}

}

したがって、メインに戻ると、配列がソートされていることがわかります。void は、メソッドがソートされた配列を返すのを防ぐと思いました。実際のケース番号を出力する必要があります。これは、0.00 が入力されているケースをスキップすることで行います。しかし、ケースピックの最初のラウンドの後、メインに「5、6、7、8、9、10」が出力されます。選択した内容に従ってケースを印刷する必要があります。これは簡単な修正だと思います。C の詳細に関する私の知識がまだ増え続けているからです。何か案は?

4

5 に答える 5

1

戻り値の型voidは、配列がソートされないようにすることとは関係ありません。関数は何も返さないと言っているだけです。

配列は関数に渡されるとポインターに減衰するため、渡された配列自体が影響を受けることがわかります。配列のコピーを作成してから渡します。そうすれば元のリストができます。

于 2013-09-18T21:57:41.287 に答える
0

C では、配列は参照によって渡されます。つまり、最初の要素へのポインタとして渡されます。そのため、ケースを関数に渡すと、実際には変更する元の配列が渡されます。コピーを作成し、実際の配列ではなくコピーをソートしてみてください。フロートは 10 個しかないので、コピーを作成しても問題ありません。

于 2013-09-18T22:00:00.727 に答える
0

実際に c++ を使用している場合は、独自の並べ替えを行う代わりに、qsort() または std::sort() の使用を検討してください。

2つの明らかな解決策があります。1)配列のコピーを作成し、コピーをソートします(簡単です。メモリを浪費します。最近では問題にならない可能性があります)。2)整数の並列配列を作成し、インデックスソートを実行します。つまり、元のものをソートする代わりに、インデックスをソートし、ソートされたバージョンが必要な場合はインデックスを使用して配列を逆参照します。

于 2013-09-18T22:00:09.717 に答える
0

さて、入力のローカルコピーを作成して並べ替えます。このようなもの:

void casesort(float cases[10])
{
    float localCases[10];
    memcopy(localCases, cases, sizeof(cases));
    ...

次にlocalCases、並べ替えを行うために使用します。

于 2013-09-18T22:06:03.253 に答える
0

配列の内容に影響を与えたくない場合は、配列のコピーを作成し、それを並べ替えルーチンに渡す (またはルーチン内でコピーを作成する) 必要があります。

Arrays Are Different™ in C; より詳細な説明については、 こちらの回答を参照してください。

于 2013-09-18T22:08:36.770 に答える