向量作为参数C

向量作为参数C,c,pointers,vector,C,Pointers,Vector,我必须做到以下几点: 给定一个带有随机数的向量,将其分成另外两个向量,奇数和偶数。但在函数中,所有向量都必须通过参数传递,不能使用全局变量。 这是我的密码: #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]

我必须做到以下几点:

给定一个带有随机数的向量,将其分成另外两个向量,奇数和偶数。但在函数中,所有向量都必须通过参数传递,不能使用全局变量。 这是我的密码:

#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不会接收偶数

数组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++;
        }
    }
}
我认为如果a或b是随机的,它们可能有超过51个值


希望有帮助。

数组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++;
        }
    }
}
我认为如果a或b是随机的,它们可能有超过51个值


希望有帮助。

您的主要问题是,您正在根据输入中的位置为输出编制索引

例如,如果您的第一个偶数位于输入[3],那么您正在将其写入偶数输出[3],其中is可能位于偶数输出[0]

您可能需要以下内容:

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

您可能还需要做一些事情来告诉调用者您找到了多少奇数和偶数,调用者可能需要以稍微不同的方式分配内存,除非这些计数相等-现在,您有101个输入,每个输出分配51个点。例如,如果您有60个偶数和40个奇数,那么您将在为偶数分配的空间的末尾之外写入。有了您提供的输入,这个问题不会出现,但在其他任何情况下,这不仅是可能的,事实上也是可能的。

您的主要问题是,您正在根据输入中的位置为输出编制索引

例如,如果您的第一个偶数位于输入[3],那么您正在将其写入偶数输出[3],其中is可能位于偶数输出[0]

您可能需要以下内容:

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

您可能还需要做一些事情来告诉调用者您找到了多少奇数和偶数,调用者可能需要以稍微不同的方式分配内存,除非这些计数相等-现在,您有101个输入,每个输出分配51个点。例如,如果您有60个偶数和40个奇数,那么您将在为偶数分配的空间的末尾之外写入。使用您提供的输入,这个问题不会出现,但在almsot任何其他情况下,这不仅是可能的,而且事实上是可能的。

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

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

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

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

从技术上讲,这并不能回答您的问题,但如果您想将奇数和偶数值分开,最好对每个值的最后一位进行一次快速排序,例如

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

以上内容未经测试,如果您发现任何bug,请随意保留。

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

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

以上内容未经测试,如果您发现任何bug,请保留它们。

您将参数作为指针传递,函数返回void。你到底认为会发生什么?在向量中,为什么要将值存储在位置i的A和B中?每个数组A和B都需要单独的计数。@JackManey,我可能遗漏了什么,但问题是什么?@JackManey:在C中没有按引用传递。OP是按值传递指针。这可能看起来很迂腐,但有一点不同,使用不正确的术语只会让初学者感到困惑。您将参数作为指针传递,而函数返回void。你到底认为会发生什么?在向量中,为什么要将值存储在位置i的A和B中?每个数组A和B都需要单独的计数。@JackManey,我可能遗漏了什么,但问题是什么?@JackManey:在C中没有按引用传递。OP是按值传递指针。这可能会让人觉得迂腐,但这是有区别的,使用不正确的术语只会让初学者感到困惑。像一个迷人的家伙一样工作!非常感谢你!像个迷人的家伙一样工作!非常感谢你!