Как добавить элементы из одного массива в другой массив неопределенного размера на основе условия? - PullRequest
0 голосов
/ 04 января 2019

Я учил себя C всего несколько недель и пытаюсь написать код, который позволяет пользователю определять размер и элементы в массиве, который затем разделяется на два массива - один для нечетных чисел и одиндля четных чисел.

Я почти уверен, что динамическое распределение как-то связано с этим, но я не уверен, как это реализовать.Вот код на данный момент:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  //User decides the size of the array of numbers-------------------------------
  int n;
  printf("How many numbers? ");
  scanf("%d",&n);

  //User inputs values into array the size of array[n]--------------------------
  int i;
  int array[n];
  printf("What are the numbers?\n");
  for(i=0; i<n; i++)
  {
    scanf("%d",&array[i]);
  }

  //loop goes through array, separates even and odds into 2 new arrays----------
  //use dynamic allocation??

  for(i=0;i<n;i++)
  {
    int *evenarray = malloc(sizeof(evenarray)); //not sure if this is setup correctly
    int *oddarray = malloc(sizeof(oddarray)); //not sure if this is setup correctly

    if(array[i] % 2 == 0) //if value in array CAN be divided by 2
    {
      printf("Test statement.\n");
    }
    else //if this is not true, append to odd array
    {
      printf("Second test statement.\n");
    }
  }
}

/*this program accepts a user chosen number of numbers
  then, the program separates the odd and even numbers into
  two different arrays*/

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Вы можете скопировать в нечетные / четные массивы и сохранить отдельные счетчики для отслеживания этого. то есть:

  //loop goes through array, separates even and odds into 2 new arrays----------
  //use dynamic allocation??

  int evencount =0;
  int oddcount =0;
  int *evenarray = malloc(sizeof(evenarray)); //not sure if this is setup correctly
  int *oddarray = malloc(sizeof(oddarray)); //not sure if this is setup correctly
  for(i=0;i<n;i++)
  {
    if(array[i] % 2 == 0) //if value in array CAN be divided by 2
    {
      printf("Printing to even array.\n");
      evenarray[evencount] = array[i];
      evencount++;
    }
    else //if this is not true, append to odd array
    {
      printf("Printing to odd array.\n");
      oddarray[oddcount] = array[i];
      oddcount++;
    }
  }

  printf("evenarray = ");
  for(i=0;i<evencount;i++){
    printf("%d, ", evenarray[i]);
  }
  printf("\n");
  printf("oddarray = ");
  for(i=0;i<oddcount;i++){
    printf("%d, ", oddarray[i]);
  }
  printf("\n");
0 голосов
/ 04 января 2019

Я вижу несколько проблем здесь.Вы не должны определять массивы с непостоянным значением, таким как переменная n , которую вы указали пользователю для ввода.

Обычно, когда вы определяете массив с постоянным значением, для вашего массива создается ровно столько пробелов.Давайте посмотрим на это, например:

#define MAX 100
<...>
int array[MAX];
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &array[i]);
<...>

Мы только что создали целочисленный массив с константой, определенной как MAX, с 100 неопределенными пробелами, но с помощью цикла for нам удалось заполнить пробелы в первых n индексах.,Например, если n равно 20, остальные 80 пробелов останутся случайными значениями, взятыми из памяти (мусор, скорее всего, -84134 ...).Это также статическая память, используемая стеком.

Это нормально, но вы можете динамически распределить достаточно места (пространство, как в простом выражении, области памяти) с помощью функции, вызываемойmalloc (), чтобы убедиться, что вам достаточно для n чисел.

  int n;
  printf("How many numbers? ");
  scanf("%d", &n);

  // User inputs values into array the size of array[n]
  int i;
  int *array = (int*)malloc(n * sizeof(int));
  printf("What are the numbers?\n");
  for(i=0; i<n; i++) scanf("%d", &array[i]);

Теперь мы использовали функцию malloc (), чтобы создать достаточно места.Malloc используется для выделения динамической памяти в куче, а не в стеке.

Определение самой функции таково:

void *malloc(size_t size)

malloc () возвращает пустой указатель нановый блок памяти вы сказали ему создать.Он имеет только один параметр, и это размер нового блока в байтах, который рассчитывается путем взятия необходимого количества «пробелов» и умножения их с помощью оператора sizeof .

Однако указатель на новый блок памяти должен быть приведен к соответствующему типу, и в этом случае это целочисленный указатель.

int *array = (int*)malloc(n * sizeof(int));

Итак, самый простой способ поместить его: сделать указатель-> иметь malloc для динамического выделения памяти для вас -> приведите ее к соответствующему типу, и вуаля, у вас есть массив с достаточным количеством пробелов.

Теперь давайте перейдем к самой задаче: мой дубль будетсначала подсчитывая, сколько существует четных и нечетных чисел, сохраняя их в отдельных целочисленных переменных, а затем динамически выделяя достаточно места для такого количества нечетных и четных чисел.

Окончательное решение:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;

    printf("How many numbers? ");
    scanf("%d", &n);

    int i, odd = 0, even = 0, counter_odd = 0, counter_even = 0;
    int *array = (int*)malloc(n * sizeof(int));

    printf("What are the numbers?\n");
    for(i = 0; i < n; i++) scanf("%d", &array[i]);

    // Counting how many odd and even numbers there are
    for(i = 0; i < n; i++) {
        if(array[i] % 2) odd++;
        else even++; 
    }
    int *even_array = (int*)malloc(sizeof(int) * even);
    int *odd_array = (int*)malloc(sizeof(int) * odd);

    // Placing the numbers in separate arrays
    for(i = 0; i < n; i++) {
        if(array[i] % 2) odd_array[counter_odd++] = array[i];
        else even_array[counter_even++] = array[i]; 
    }

    // Printing them out
    printf("\nOriginal array: ");
    for(i = 0; i < n; i++) printf("%d ", array[i]);

    printf("\nOdd array: ");
    for(i = 0; i < odd; i++) printf("%d ", odd_array[i]);

    printf("\nEven array: ");
    for(i = 0; i < even; i++) printf("%d ", even_array[i]);

    return 0;
}

И контрольный пример:

How many numbers? 5
What are the numbers?
1
2
3
4
5

Original array: 1 2 3 4 5
Odd array: 1 3 5
Even array: 2 4
0 голосов
/ 04 января 2019

Нет волшебного способа получить эту информацию на один выстрел .Тем не менее, вы можете попробовать любой из следующих способов:

  • Цикл по первому массиву, чтобы выяснить количество нечетных (или четных) чисел, затем вы знаете количество элементов, для которыхпамять должна быть распределена, и вы можете использовать VLA (как сам первый массив) или использовать функции указателя и распределителя для выделения памяти.

    -> Однако в этом процессе вы должны выполнитьнечетная / четная проверка дважды - один раз для подсчета появления нечетных / четных чисел и в следующий раз для фактического решения и копирования их в новые местоположения.

  • Выделите два фрагмента памяти аналогичнодо первого размера массива, и начните заполнять нечетные и четные элементы в новой памяти, соответственно.После того, как все элементы сохранены, возьмите подсчет realloc() выделенных ячеек памяти до точного размера.

    -> В этом случае предварительное распределение должно быть выполнено, но проверка нечетного / четногонеобходимо выполнить только один раз.

...