Передача и возвращение функции структуры - PullRequest
0 голосов
/ 29 ноября 2018

Может кто-нибудь помочь мне написать основную функцию этой функции aadjacentElementsProduct?вопрос в следующем:

Вот что я попробовал:

struct arr_integer
{
  int size;
 int arr[];
};
int adjacentElementsProduct(struct arr_integer inputArray);
int main()
{
  int res,i;
  struct arr_integer array;
  printf("Enter size of the array: ");
  scanf("%d", &array.size);
  printf("Enter the elements in array: ");
  for (i = 0; i < array.size; i++)
  {
        scanf("%d", &array.arr[i]);
  }
      printf("%d\n", array.arr[2]); 
 res = adjacentElementsProduct(array);
 printf("Max is %d", res);
 getch();

 }

Учитывая массив целых чисел, найдите пару смежных элементов, которая имеет наибольший продукт, и верните этот продукт.

Пример

Для inputArray = [3, 6, -2, -5, 7, 3], на выходе должно быть adjacentElementsProduct(inputArray) = 21.

7 и 3 дают самый большой продукт.

int adjacentElementsProduct(struct arr_integer inputArray)
{
    int arrLength = inputArray.size;
    int max = inputArray.arr[0] * inputArray.arr[1];

    for (int i = 1; i < arrLength - 1; i++)
    {
        if (inputArray.arr[i] * inputArray.arr[i + 1] > max)
        {
            max = inputArray.arr[i] * inputArray.arr[i + 1];
        }
    }
    return max;
}

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Хотя ответы о недостающем распределении памяти верны, я думаю, что было бы легче изменить это следующим образом:

struct arr_integer
{
  int size;
  int *arr; //<<<<<<<<<<
};

int adjacentElementsProduct(struct arr_integer inputArray);

int main()
{
  int res,i;
  struct arr_integer array;
  printf("Enter size of the array: ");
  scanf("%d", &array.size);
  //Of course add check for return value of scanf and to
  // the validity of the size
  array.arr = malloc(array.size * sizeof(*array.arr));
  //and check the malloc return
  //and later free the allocated memory!

.
.
.

Это позволяет OP по-прежнему использовать «обычный» синтаксис для объявленияstruct и malloc - только динамическая часть.Я думаю, что это более читабельно.

0 голосов
/ 29 ноября 2018

Элемент структуры arr является гибким элементом массива .По умолчанию у него нет размера или даже выделенной памяти, его нужно выделить.И это может быть сделано только путем динамического выделения всей структуры (используя, например, malloc).

Таким образом, решение выглядит примерно так:

struct arr_integer *array;
size_t array_size;

// Get the number of elements for the array
printf("Enter size of the array: ");
scanf("%zd", &array_size);

// Allocate memory for both the structure and the array data
array = malloc(sizeof *array + sizeof *array->arr * array_size);
array->size = array_size;

// Now you can initialize `array->arr[i]` for any `i` between `0` and `array->size - 1`
0 голосов
/ 29 ноября 2018

Проблема в том, что вы не выделяете память.Ваша структура с синтаксисом [] в конце называется «членом гибкого массива».Он может использоваться только в том случае, если вы выделите память для структуры вручную, например:

#include <stdlib.h>

...

printf("Enter size of the array: ");
int size;
scanf("%d", &size);

struct arr_integer* array = malloc( sizeof(*array) + sizeof(int[size]) );
array->size = size;

printf("Enter the elements in array: ");
for (i = 0; i < array.size; i++)
{
    scanf("%d", &array.arr[i]);
}

...
free(array);
0 голосов
/ 29 ноября 2018

@ Muneer.Вам просто нужно перенастроить ваш для цикла следующим образом:

int adjacentElementsProduct(struct arr_integer inputArray)
{
    int arrLength = inputArray.size;
    int max = inputArray.arr[0] * inputArray.arr[1];

    for (int i = 2; i < arrLength - 1; i++)
    {
        if (inputArray.arr[i-1] * inputArray.arr[i] > max)
        {
            max = inputArray.arr[i-1] * inputArray.arr[i];
        }
    }

    return max;
}

Обратите внимание на первое значение i в цикле ( я = 2 )

...