Как вернуть массив только с четными / нечетными числами и удалить ненужные ячейки? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь получить массив, число и переменную is_even bool от пользователя и вернуть новый массив только четных чисел, иначе возвращает массив только нечетных чисел в зависимости от is_even. например: массив {1,2,3,4} и is_even = 1 вернут {2,4}, если is_even = 0, возвращенный массив будет {1,3} как я понял, я должен динамически распределять массив перед передачей его функции. что я сделал до сих пор

Я застрял с возвращением. Я проверил, является ли содержимое, указанное p, четным или нечетным, но как стереть ячейки?

#include <stdio.h>
#include <malloc.h>

  int *new_array(int *p,int number,int is_even){
  int j,i=0;
  int counter=0;
    if(is_even){
      for(j=0;j<number;j++){
        if(*(p+j)%2==0){
        }
      }
      return p;
    }
  }


  void main() {
    int n,i,is_even;
    int *p;
    printf("enter number of elements");
    scanf("%d",&n); rewind(stdin);
    printf("hoose is_even 1 or 0");
    scanf("%d",&is_even);rewind(stdin);

    p=(int *)malloc(n* sizeof(int));
    for(i=0;i<n;i++){
      scanf("%d",p+i);
    }
    p=new_array(p,n,is_even);
    for(i=0;i<n;i++){
      printf("%4d",*(p+i));
    }
  }

Ответы [ 2 ]

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

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

Вы спрашиваете,

как стереть клетки?

, но «стирание» - это не то, что вы можете сделать. Вы можете перезаписывать элементы массива различными значениями, но нельзя заставить отдельный элемент массива перестать существовать, особенно не с середины массива. Обычная идиома состоит в том, чтобы поместить элементы, которые вы хотите сохранить, в исходные элементы либо исходного, либо нового массива, и вернуть количество этих элементов. В случае нового массива вы также должны вернуть указатель на (динамически размещаемый) массив. Представленная вами сигнатура функции не подходит, потому что она не дает хороших средств для возврата количества элементов.

Существует несколько способов решения этой проблемы. Проще всего было бы сделать number параметром in / out, передав указатель на количество элементов вместо значения количества элементов:

int *new_array(int *p, int *number, int is_even) {
    // ... 'j' keeps a running count of the number of is_even elements

    *number = j;  // Write the final number of elements back to the caller
    return p;     // return the allocated array
}

Детали реализации должны будут немного измениться, чтобы учесть изменение типа и использования параметра number, а также для исправления ошибок.

Тогда вы можете назвать это так:

p = new_array(p, &n, is_even);

... и потом продолжайте, как вы уже делали.

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

Вы можете поместить все свои четные / нечетные числа в начало массива, переместить () массив для его нового размера и отправить значение его новой длины обратно в ваш ответ. но вам потребуется ваша функция для получения (int ** Array), чтобы изменить указатель для массива

поэтому объявление функции может быть int new_array (int ** p, int number, int is_even)

Проблема заключается не в удалении ячеек, а в том, что когда вы их удаляете, длина ваших массивов больше не совпадает ..

Кстати, вы также можете изменить значение длины и вернуть новое добавление для нового массива с помощью int * new_array (int * p, int * number, int is_even)

...