2015-11-24 3 views
0

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

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

«Динамически выделить другой массив из 10 целых чисел. Копировать элементы от первого ко второму, но в обратном порядке (т.е. по убыванию). Отобразить элементы первого и второго массивов в порядке и освободить динамически выделенный массив. "

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

* Я не включил функции, так как не считаю, что они необходимы для этой части, но если да, то я также опубликую их.

Заранее благодарим за любые предложения и разъяснения.

#include <iostream> 

using namespace std; 

void sortArray(int * , int); 
void showArray(const int * , int); 
int binarySearch(const int *, int, int); 

int main(void) 
{ 
    int const MAX_NUM = 10; 
    int numbers [MAX_NUM]; 
    int counter; 
    int findval; 
    int index; 
    char again; 

    cout<< "Please enter 10 integer values."<< endl; 
    for(counter=0; counter< MAX_NUM ; counter++) 
    { 
     cout << "Enter a value for "<< counter+1 << ": "; 
     cin >> *(numbers+counter); 
    } 


    sortArray(numbers, 10); 

    cout << endl << "The values in ascending order are: " << endl; 
    showArray(numbers, 10); 

    do 
    { 
     cout<< endl << "Enter the value you are searching for: "; 
     cin >> findval; 
     cout << endl; 
     index = binarySearch(numbers , MAX_NUM , findval); 
     // Display the results of the search. 
     if (index == -1) 
      cout << "Number was not found." << endl << endl; 
     else 
      cout << "Number "<< findval<<" found in position " << index + 1 << endl << endl; 
     // Does the user want to do this again? 
     do 
     { 
      cout << "Would you like to look up another number? (y/n) "; 
      cin >> again; 
     } 
     while(again != 'y' && again != 'Y' && again != 'n' && again != 'N'); 
    } 
    while (again == 'Y' || again == 'y'); 

    cout<< endl << "Thank You. Press the return key to continue..."; 

    cin.get(); 
    cin.ignore(); 
    return 0; 
} 
+1

Вы не динамически ничего не выделяете здесь! Ваш массив в значительной степени ** статически ** выделен 'int numbers [MAX_NUM];' – simpel01

+0

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

+1

Необработанные массивы в C++ не являются * динамическими массивами * (при необходимости увеличиваются или уменьшаются), но могут быть распределены динамически (по сути, тег 'dynamic-arrays' неверен для использования для этого вопроса - проверьте описание тегов при вводе). – crashmstr

ответ

0

Оператор new следует использовать для выделения памяти. Для использования dealloaction используется delete.

Начать с выделением памяти:

int * dynArr = NULL; // pointer to work with dynamic array 
    dynArr = new int[MAX_NUM]; // allocation of memory 

Затем проверьте, что память была выделена, как:

if(dynArr != NULL) 
    { 
     // do something 
    } 
    else 
    { 
     // report about problem and do not use pointer 
    } 

и использовать функцию для копирования элементов, например:

void reversCopy(const int * source, int * destination, int number) 
// Function for copying numbers from one array (memory) to other 
// in the revers order (first element goes to the last position). 
// source - pointer to array where numbers will be read 
// destination - pointer to array where numbers will be written 
// number - number of elements to be copyed 
{ 
    for(int i = 0; i < number; i++) 
    { 
     destination[i] = source[number - 1 - i]; 
    } 
} 

В конце концов , свободная память с оператором:

delete[] dynArr; 
    dynArr = NULL; 

и не использовать dynArr после этого.

+0

Для массива в C++ это не совсем правильный ответ. –

+0

Более конкретно, для массивов 'new []' следует использовать для выделения памяти и 'delete []' для освобождения памяти. – Derek

+0

В C++ для 'new []' следует использовать 'std :: vector'. –

5

Управление динамической памятью должно выполняться с использованием стандартных классов и концепций C++, доступных либо с smart pointers, либо с containers.

Использование языка C++ правильно не требует использования new/delete для большинства случаев использования, которые вам действительно необходимо покрыть.

+0

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

+0

Это правильный способ сделать это. – user4581301

+1

@Derek Ну, я не забочусь о _academia_, как давно не указано явно. У нас есть эти механизмы на месте, и вопрос за пределами кажется бесполезным. На самом деле я ненавижу академию, пытающуюся научить ее на первом месте, прежде чем получить доступные языковые конструкции правильно –

Смежные вопросы