矢量作为参数C

时间:2012-06-18 17:12:41

标签: c pointers vector

我必须做以下事情:

给定一个带随机数的向量,将它分成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 个答案:

答案 0 :(得分: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个奇数,你将写入超出你为偶数分配的空间的末尾。使用你提供的输入,这个问题赢了不会出现,但在任何其他情况下,它不仅可能,而且实际上可能。

答案 1 :(得分: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++;
        }
    }
}

尝试使用不错的debugger tool,这有助于您在代码中找到此类错误。

您还需要检查阵列的长度:

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

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

希望它有所帮助。

答案 2 :(得分:0)

以下是一些提示:除了你几乎总是拼写错误的“向量”之外,你使用的是经典的c数组而不是向量。你的vector方法需要一些重构,因为你不必使用额外的内存和双重赋值变量。

#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;
}

答案 3 :(得分:0)

这在技术上不是你问题的答案,但是如果你想分开奇数和偶数值,你最好在每个值的最后一位做一次QuickSort传递,例如

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;
        }
    }

以上是未经测试的,如果您发现任何错误,请随时保留它们。