向量作为参数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是按值传递指针。这可能会让人觉得迂腐,但这是有区别的,使用不正确的术语只会让初学者感到困惑。像一个迷人的家伙一样工作!非常感谢你!像个迷人的家伙一样工作!非常感谢你!