2

私は次のことをしなければなりません:

乱数を含むベクトルを指定して、それを奇数と偶数の 2 つのベクトルに分けます。ただし、関数では、すべてのベクトルをパラメーターを介して渡す必要があります (グローバルは使用できません)。これが私のコードです:

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

void vetores(int *vetor, int *A, int *B)
{
    int i = 0,aux;
    for(i = 0;i < 100; i++)
    {
        if(vetor[i] % 2 == 0)
        {
            aux = vetor[i];
            A[i] = aux;
        }else{
            aux = vetor[i];
            B[i] = aux;
        }
    }
}

int main()
{
    int vetor[101], a[51], b[51],i;

    /*a = (int)malloc(sizeof(int)*51);
    b = (int)malloc(sizeof(int)*51);*/

    for(i = 0; i < 100; i++)
    {
        vetor[i] = i;
    }

    vetores(vetor,a,b);

    for(i = 0; i < 50; i++)
    {
        if(vetor[i] % 2 == 0)
        {
            printf("%d",a[i]);
        }else
        {
            printf("%d",b[i]);
        }
    }

    return 0;
}

そのコードをテストすると、ベクトルが変更されており (変更されることは想定されていません)、A ベクトルは偶数を受け取っていません!

4

4 に答える 4

3

あなたの主な問題は、入力の位置に基づいて出力にインデックスを付けていることです。

たとえば、最初の偶数が にある場合input[3]、それを に書き込んでいます。 even_output[3](おそらく) は にあるはずeven_output[0]です。

おそらく次のようなものが必要です。

if (input[i] %2 == 0)
    *A++ = input[i];
else
    *B++ = input[i];

また、見つかった奇数と偶数の数を発信者に伝えるために何かを行う必要がある場合もあります (これらの数が同じでない限り、発信者は少し異なる方法でメモリを割り当てなければならない場合があります。現在、101 個の入力と 51 個のスポットが割り当てられています)。各出力に対して. (たとえば) 60 個の偶数と 40 個の奇数があった場合, 偶数に割り当てたスペースの終わりを超えて書き込むことになります. あなたが提供した入力を使用すると, その問題は発生しません. 、しかし、それ以外の場合は、可能であるだけでなく、実際に可能性があります.

于 2012-06-18T17:20:21.910 に答える
1

配列 A と B には個別のインデックス数が必要です。

これを試して:

void vetores(int *vetor, int *A, int *B)
{
    int i = 0,aux;
    int aIndex = 0, bIndex = 0;
    for(i = 0;i < 100; i++)
    {
        if(vetor[i] % 2 == 0)
        {
            A[aIndex] = vetor[i];
            aIndex++;
        }else{
            B[bIndex] = vetor[i];
            bIndex++;
        }
    }
}

コード内のこの種のエラーを見つけるのに役立つ便利なデバッガー ツールを使用してみてください。

配列の長さも確認する必要があります。

int vetor[101], a[51], b[51]

ランダムな場合、51を超える値があると思いますab

それが役に立てば幸い。

于 2012-06-18T17:18:47.100 に答える
0

これは技術的にはあなたの質問に対する答えではありませんが、奇数と偶数の値を分離したい場合は、各値の最後のビットでQuickSortを1回パスすることをお勧めします。

int temp, i = 0, j = N-1;
while ( i < j ) {
    while ( vetor[i] & 1 == 0 )
        i += 1;
    while ( vetor[j] & 1 == 1 )
        j -= 1;
    if ( i < j ) {
        temp = vetor[i];
        vetor[i] = vetor[j];
        vetor[j] = temp;
        }
    }

上記はテストされていません。バグを見つけた場合は、遠慮なく保管してください。

于 2012-06-18T17:28:17.910 に答える
0

ここにいくつかのヒントがあります: ほとんど常に「ベクトル」のつづりを間違えていることに加えて、ベクトルではなく古典的な c 配列を使用しています。追加のメモリと二重割り当て変数を使用する必要がないため、ベクトル メソッドにはかなりのリファクタリングが必要です。

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

void vectores(int *vector, int *A, int *B)
{
    int i = 0, k = 0, l = 0;
    for(;i < 100; i++)
    {
        if(vector[i] % 2 == 0)
        {
            A[k++] = vector[i];
        }else{
            B[l++] = vector[i];
        }
    }
}

int main()
{
    int vector[100], a[51], b[51],i;

    for(i = 0; i < 100; i++)
    {
        vector[i] = i;
    }

    vectores(vector,a,b);
    for(i = 0; i < 51; i++){
        printf("%d          %d",a[i], b[i] );
        printf("\n");
    }
    return 0;
}
于 2012-06-18T17:22:35.093 に答える