2012-01-03 2 views
0

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

Разработка функции 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; 
} 

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

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

+0

Если вы хотите, чтобы массивы были динамическими, вы должны изменить функцию 'ADDER', чтобы получить один или два параметра, размер массивов. В противном случае «ADDER» не сможет узнать размер массивов. –

+0

хорошо, но как? – Amjad

+0

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1047673478 – obo

ответ

3

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

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

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

Другим вариантом было бы использование структур.

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); 
} 
+2

Лучше не выводить возвращаемое значение типа 'malloc' в C, также упоминание о «свободе» было бы неплохо! –

+0

Ну, спасибо, но я должен использовать ADDER (a, a) не (a, b). как вы думаете, это будет работать в этом случае? – Amjad

+0

@ another.anon.coward: Обновлено с помощью бесплатных() блоков! –

0

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

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

for (i = 0; i < SIZE; i++) { 
    b[i] += a[i]; 
} 
+0

Я думаю, что мне нужно получить размеры во время компиляции и сравнения. но где я могу использовать malloc? это требование. – Amjad

+0

Задайте пользователю количество элементов в массиве, а затем используйте malloc, как описано здесь. Http://www.roseindia.net/c-tutorials/c-dynamic-array.shtml –

1

Как о чем-то вроде этого:

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 «ссылка» - это просто указатель. См. this SO вопрос для некоторых хороших ответов об этой части.

+0

ADDER должен иметь только два параметра – obo

+0

, и он должен быть того же массива. ADDER (a, a) – Amjad

+1

@HelloWorld Отвечено обновлено –

0

Вам нужно будет прочитать ввод пользователя в одной переменной 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. Число, которое хранится в этой переменной, - это размер вашего массива и количество пользовательских входов, которые у вас есть. Также не забудьте позвонить бесплатно (inptarray) после того, как вы закончите использовать свой массив, чтобы освободить заявленную память.