2012-06-18 4 views
2

Мне нужно сделать следующее:Вектор как параметр C

Для вектора со случайными числами выделите его в 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; 
} 

Если проверить, что код, вектор их изменения (не предполагается), а вектор не получает даже номера!

+0

Вы передаете свои аргументы в качестве указателей, и ваша функция возвращает 'void'. Что именно, ты думаешь, что произойдет? –

+1

В 'vectores' почему вы храните значения в' A' и 'B' в позиции' i'? – Pedro

+2

У вас должен быть отдельный счет для каждого массива A и B. – jn1kk

ответ

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 нечетных чисел, вы будете писать за пределами пространства, которое вы выделили для даже с номерами. С предоставленными вами вставками эта проблема не возникнет, но в любом другом случае это не только возможно, но и фактически возможно.

+0

Работал как чувак-чувак! Большое спасибо ! – Leonardo

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] 

Я думаю a или b может иметь более 51 значений, если они являются случайными.

Надеюсь, это поможет.

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

Вышеупомянутый не проверен, если вы найдете какие-либо ошибки, не стесняйтесь их хранить.

Смежные вопросы