Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Как реализовать динамический массив? C++

#cpp #динамические_массивы #выделение_памяти


Есть программа сортировки одномерного массива из 25 элементов. Как сделать программу,
которая могла бы сортировать одномерный массив любой размерности? Если вас не затруднит,
объясните, как правильно выделять память под динамический массив, пользоваться указателями
и оператором "&" для получения значения по указанному адресу, спасибо за помощь, вот
код для массива из 25 элементов.     

#include 
#include 
#include 
#include 

using namespace std;
int main(void) {
char *locale = setlocale(LC_ALL, "");


     << "Введите массив А, состоящий из 25 целых чисел." << endl
     << "Программа  определит и выведет на экран максимальный нечетный элемент массива."
<< endl
     << "Ожидание ввода..." << endl;

 int N=25;


int k, max;

// Объявляем массив на 25 целых чисел и заполняем его с клавиатуры
int A(N){};
for (int i = 0; i < N; i++) {
    k = (i+1);
    cout << k << " элемент = ";
    cin >> A[i];

}


max = A[0];
for (int i = 1; i < N; i++) {
    if (i%2 == 0){
        if (max < A[i]) {
            max = A[i];
            k = (i+1);
        }
    }
}
cout << "Максимальный нечетный " << k <<" элемент массива = " << max << endl << "==================================="
<< endl << endl;

cout << "Вывод массива до сортировки" << endl;

    for (int i = 0; i < N; i++) {
        cout << A[i] << ' ';
    }
    cout << endl << endl;

    for (int i = 0; i < N-1; i++) {
    int mindex = i;

    int tmp = 0;

    for (int j=i+1; j < N; j++) {
        if (A[j] < A[mindex]) {
            mindex = j;
        }
    }
    if (i != mindex) {
        tmp = A[i];
        A[i] = A[mindex];
        A[mindex] = tmp;
    }
}
cout << "Вывод массива после сортировки" << endl;
for (int i = 0; i < N; i++) {
    cout << A[i] << ' ';
}
cout << endl;



return 0;
}


Код с вектором

 #include 
 #include 
 #include 
 #include 
 #include 

  using namespace std;
  int main(void)
 {
char *locale = setlocale(LC_ALL, "");

cout << "Введите массив А, состоящий из N целых чисел." << endl
     << "Программа  определит и выведет на экран максимальный нечетный элемент массива."
<< endl
     << "Ожидание ввода N..." << endl;

 int N;
 cin >> N;

int max, k;

// Объявляем массив на 25 целых чисел и заполняем его с клавиатуры
vector  A[N];
for (int i = 0; i < N; i++) {
    k = (i+1);
    cout << k << " элемент = ";
    cin >> A[i];

}


max = A[0];
for (int i = 1; i < N; i++) {
    if (i%2 == 0){
        if (max < A[i]) {
            max = A[i];
            k = (i+1);
        }
    }
}
cout << "Максимальный нечетный " << k <<" элемент массива = " << max << endl << "==================================="
<< endl << endl;


cout << "Вывод массива до сортировки" << endl;

    for (int i = 0; i < N; i++) {
        cout << A[i] << ' ';
    }
    cout << endl << endl;

    for (int i = 0; i < N-1; i++) {
    int mindex = i;

    int tmp = 0;

    for (int j=i+1; j < N; j++) {
        if (A[j] < A[mindex]) {
            mindex = j;
        }
    }
    if (i != mindex) {
        tmp = A[i];
        A[i] = A[mindex];
        A[mindex] = tmp;
    }
}
cout << "Вывод массива после сортировки" << endl;
for (int i = 0; i < N; i++) {
    cout << A[i] << ' ';
}
cout << endl;
return 0;
}


Спасибо всем кто помог. Вот код через указатели.

  #include 
  #include 
  #include 

  using namespace std;
  int main(void)
  {
  char *locale = setlocale(LC_ALL, "");

  cout << "Введите массив А, состоящий из N целых чисел." << endl
  << "Программа  определит и выведет на экран максимальный нечетный элемент 
 массива." << endl
 << "Ожидание ввода N..." << endl;

  int N;
  cin >> N;

   int max, k;


   int *A = new int[N]();
   for (int i = 0; i < N; i++) {
    k = i+1;
    cout << k << " элемент = ";
    cin >> A[i];

    }


    max = A[0];
    for (int i = 1; i < N; i++) {
    if (i%2 == 0){
      if (max < A[i]) {
        max = A[i];
        k = (i+1);
      }
    }
  }
cout << "Максимальный нечетный " << k <<" элемент массива = " << max << 
endl << "===================================" << endl << endl;


cout << "Вывод массива до сортировки" << endl;

for (int i = 0; i < N; i++) {
    cout << A[i] << ' ';
}
cout << endl << endl;

for (int i = 0; i < N-1; i++) {
int mindex = i;

int tmp = 0;

for (int j=i+1; j < N; j++) {
    if (A[j] < A[mindex]) {
        mindex = j;
    }
}
if (i != mindex) {
    tmp = A[i];
    A[i] = A[mindex];
    A[mindex] = tmp;
}
  }
        cout << "Вывод массива после сортировки" << endl;
    for (int i = 0; i < N; i++) {
     cout << A[i] << ' ';
     }
     cout << endl;
     delete [] A;
     return 0;
     }

    


Ответы

Ответ 1



Память под "голый" массив неизвестного размера в С++ можно выделить так int *A = new int[N]; Элементы такого массива будут изначально содержать "мусор". В вашем коде вам фактически не нужна изначальная инициализация элементов массива, но если вам так больше нравится, вы можете сделать int *A = new int[N](); // или int *A = new int[N]{}; В этих вариантах содержимое массива будет изначально обнулено. Когда такой массив становится ненужным, память следует освободить через delete[] A; Остальной код при этом менять не нужно. Однако, если уж вам нужен "голый" массив, то лучше поступить так #include ... std::unique_ptr A(new int[N]); С таким указателем/массивом можно работать обычным образом (т.е. A[i]), но память будет освобождена автоматически.

Ответ 2



Раз тег с++ стоит, так будем делать по с++сному. Вначале в самом верху добавим ещё один инклуд #include вектор - это то, что обычно нужно, когда хочется расширяющийся массив (массив произвольного размера). Вместо int N = 25; пишем int N; cin >> N; Вместо int A[N]; пишем так vector A(N); Все, готово!

Комментариев нет:

Отправить комментарий