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 中的位置索引输出

例如,如果您的第一个偶数在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]

如果它们是随机的,我认为ab可能有超过 51 个值。

希望能帮助到你。

于 2012-06-18T17:18:47.100 回答
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 回答
0

从技术上讲,这不是您问题的答案,但是如果您想区分奇数和偶数值,最好对每个值的最后一位执行一次快速排序,例如

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 回答