C - использование динамических массивов - PullRequest
0 голосов
/ 03 января 2012

У меня проблема в C. Это вопрос:

Разработка функции C ADDER, которая добавляет два целых массива вместе. У ADDER должно быть только два параметра, которые являются двумя массивами, которые нужно добавить. Второй аргумент массива будет содержать сумму массивов при выходе. Оба параметра должны быть переданы по ссылке.

Напишите программу на C для проверки функции ADDER с помощью вызова ADDER (A, A), где A - это массив, который нужно добавить к себе. Массив A может быть любого размера с любыми значениями. Напишите, скомпилируйте и выполните программу.

Объясните результаты программы.


Пока я решил это таким образом, и он прекрасно работает:

#include <stdio.h>

// using namespace std;

const int SIZE = 5;

/* Adds two arrays and saves the result in b
 * Assumes that b is larger than or equal to a in size
 */

void ADDER(int (&a)[SIZE], int (&b)[SIZE]) {
    int aSize, bSize, i; /* variable declaration */
    /* find out the sizes first */
    aSize = sizeof (a) / sizeof (int);
    bSize = sizeof (b) / sizeof (int);
    /* add the values into b now */
    for (i = 0; i < aSize; i++) {
    b[i] = b[i] + a[i];
    }
    /* we have the sum at the end in b[] */
}

/* Test program for ADDER */

int main() {
int i; /* variable declaration */
int a[] = {1, 2, 3, 4, 5}; /* the first array */

/* add them now */
ADDER(a, a);
/* print results */
printf("\nThe sum of the two arrays is: ");
for (i = 0; i < SIZE; i++) {
    printf("%d ", a[i]); /* print each element */
}
return 0;
}

Проблема в том, что мне нужно использовать динамические массивы и использовать malloc и realloc в программе для вычисления размера массива на лету. Вместо того, чтобы указывать размер массива и сами элементы, я хочу, чтобы программа запросила ввод данных пользователем, и пользователь вводит массив, и размер там определяется. Все должно быть динамично. Я не знаю, как это делается. Может кто-нибудь, пожалуйста, помогите мне! Спасибо!

Также я должен объяснить, как массив добавляется к самому себе, результат сохраняется в «а», а исходный массив теряется и заменяется суммой. как я могу это объяснить?

Ответы [ 4 ]

3 голосов
/ 03 января 2012

Вот как должна выглядеть ваша программа

int size; //global variable

void ADDER(int *a, int *b) {
    int i;
    for (i = 0; i < size; i++) {
        b[i] += a[i];
    }    
}

int main(){
    //ask the user to input the size and read the size
    int *a = (int *)malloc(size*sizeof(int));
    int *b = (int *)malloc(size*sizeof(int));

    //fill up the elements
    Adder(a,b);
    //print out b
    free(a->array);
    free(b->array);
}

AL Хотя использовать глобальные переменные нецелесообразно, суть в том, что сумматору каким-то образом нужно знать размер массива и как-то вам нужно передатьразмер к функции ADDER.Если это невозможно сделать с помощью параметров, вы должны использовать глобальные переменные.

Другой вариант - использовать структуры.

typedef struct myArray{
    int *array;
    int length;
}ARRAY;

void ADDER(ARRAY *a, ARRAY *b) {
    int i;
    for (i = 0; i < b->length; i++) {
        b->array[i] += a->array[i];
    }    
}

int main(){
    int size; //local variable
    //ask the user to input the size and read into the 'size' variable
    ARRAY *a, *b;
    a->array = (int *)malloc(size*sizeof(int));
    b->array = (int *)malloc(size*sizeof(int));
    a->length = b->length = size;

    //fill up the elements
    Adder(a,b);
    //print out b.array
    free(a->array);
    free(b->array);
}
1 голос
/ 03 января 2012

Как насчет этого:

size_t length;

void ADDER(int *a, int *b)
{
    for (int i = 0; i < length; i++)
    {
        /* Add the arrays */
    }
}

int main()
{
    /* Get the number of entries in the arrays from the user */
    /* Store the result in the global variable "length" */
    /* Check the "scanf" function for that */

    int *a;
    /* Allocate the array */
    /* Remember that "malloc" wants the size in bytes, not number of items in the array */

    /* Get all items for the array from the user */

    /* Now add the array to itself */
    ADDER(a, a);

    /* Print the result */

    /* Free the array, a very important step! */
}

Как вы можете видеть, это не полный код, но дает подсказки о том, что следует делать и где. Надеюсь, это поможет.

Редактировать 2 Заметка о слове "ссылка". Использование ссылок отличается в C и C ++. То, как вы объявили свою функцию ADDER с int (&a)[SIZE], использует функцию C ++ с &. В простом C «ссылка» - это просто указатель. См. этот SO вопрос для некоторых хороших ответов об этой части.

0 голосов
/ 03 января 2012

Вам нужно будет прочитать пользовательский ввод в одной переменной int.После этого вам нужно будет выделить еще один пробел для вашего массива int, а затем приступить к вставке числа в ваш массив.

 int main() {
   int inpt;   //user input.
   int inptcnt=0;  //amount of numbers given by the user.
   char flag='y';    //use this char to know if the user wants to insert another number or no.
   int *inptarray; //this pointer will be your int array.

   inptarray = (int *) malloc (sizeof(int));  //Here you generate the first entry for your array.
   if (inptarray == NULL) {   //Never forget to check if Malloc and Realloc failed.
         printf("Memory Error!!!\n);
         exit(1);
   }

   while (flag == 'y') {
     printf("Please enter a number:");
     scanf("%d", inpt);  //you ask from the user to input a number
     inptcnt++;  //You add one to the amount of numbers you have been given.
     printf("\nIf you wish to enter another number as well please press 'y'. Press anything else if you dont:");
     scanf(" %c", flag);
     inptarray[inptcnt - 1] = inpt;   //You add the number given by the user to your array.
     if (flag != 'y') {
       break;
     } else {

       realloc(inptarray, inptcnt * sizeof(int));  // Here you add space for the new entry to your array.
       if (inptarray == NULL) {   //Never forget to check if Malloc and Realloc failed.
         printf("Memory Error!!!\n);
         exit(1);
       }
     }
   }
 }

Вот так вы можете сгенерировать массив любого необходимого размера в соответствии спользовательский ввод.Вы можете получить доступ к значению размера этого массива через переменную inptcnt.Число, которое хранится в этой переменной, представляет собой размер вашего массива и количество пользовательских вводимых вами данных.Также не забудьте позвонить free (inptarray) после того, как вы закончите использовать свой массив, чтобы освободить требуемую память.

0 голосов
/ 03 января 2012

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

Если вы знаете размер во время компиляции (и в соответствии с вашим кодом вы это делаете!), Вы можете просто использовать ту же самую константу при переборе по массиву:

for (i = 0; i < SIZE; i++) {
    b[i] += a[i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...