Страницы

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

среда, 29 января 2020 г.

C++ добавление элемента в конец динамического массива

#cpp #массивы #указатели


Помогите не могу разобраться почему не работает:
Необходимо в конец динамического массива добавить сумму его элементов.

Мой код:

#include "stdafx.h"
#include 
using namespace std;
int* createArray(int*, int);
void fillArray(int*, int);
void printArray(int*, int);
void deleteArray(int*);
void addElemet(int*, int);
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "rus");
    int num = 0;
    cout << "Введите количество элементов массива ";
    cin >> num;
    int sum = 0;
    int *pArray = NULL;
    pArray = createArray(pArray, num);
    fillArray(pArray, num);
    addElemet(pArray, num);
    printArray(pArray, num);
    deleteArray(pArray);
    return 0;
}
int* createArray(int *massiv, int number) //создание динамического массива
{
    return massiv = new int[number];    
}
void fillArray(int* massiv, int number) //ввод данных в массив
{
    for (int i = 0; i < number; i++)
    {
        cout << "Введите " << i + 1 << "-тый элемент массива ";
        cin >> massiv[i];
    }
    cout << "------------------------------------------------------------------------------"
<< endl;
}
void printArray(int* massiv, int number) // вывод массива на печать
{
    for (int i = 0; i < number; i++)
    {
        cout << massiv[i] << " ";
    }
    cout << endl;
}
void deleteArray(int* massiv) //Очистка памяти
{
    delete[] massiv;
}
void addElemet(int *massiv, int number) //добавление элемента в конец массива
{
    int *temp = NULL;
    int numTemp = number + 1;
    int sum = 0;
    temp = createArray(temp, numTemp); // создаем временный массив
    for (int i = 0; i < number; i++)
    {
        temp[i] = i; //massiv[i]; // копируем данные со старого массива
        sum += massiv[i];
    }
    temp[numTemp] = sum; // не добавляет элемент в конец массива, при выводе на экран
скопированные элементы отображаются нормально, а последний отображает набор цифр 
    deleteArray(massiv); // удаляем старый массив

    massiv = createArray(temp, numTemp); 

    massiv = temp; //копируем временный массив в новый.
    deleteArray(temp); //удаляем временный массив
}

    


Ответы

Ответ 1



Поправить, кстати, совсем несложно: int * addElemet(int *massiv, int number) //добавление элемента в конец массива { int *temp = NULL; int numTemp = number + 1; int sum = 0; temp = createArray(temp, numTemp); // создаем временный массив for (int i = 0; i < number; i++) { temp[i] = massiv[i]; // копируем данные со старого массива sum += massiv[i]; } temp[number] = sum; // добавляет элемент в конец массива, при выводе на экран скопированные элементы отображаются нормально, а последний отображает набор цифр deleteArray(massiv); // удаляем старый массив return temp } и в main: pArray = addElemet(pArray, num); Эдакий plain C style получается. Чтобы уж совсем олдскульно выглядело: int * addElemet(int *massiv, int number) //добавление элемента в конец массива { int *temp = NULL; temp = createArray(temp, number+1); // создаем временный массив temp[number] = 0; for (int i = 0; i < number; i++) temp[number] += (temp[i] = massiv[i]); // копируем данные со старого массива deleteArray(massiv); // удаляем старый массив return temp } Максимально лаконично: #include using namespace std; int * add_element(int *source, int size) { int *dest = new int[size+1], i; for (i = 0, dest[size]=0; i

Ответ 2



Проблема в функции void addElemet(int *massiv, int number). Дело в том, что вы передаёте int *massiv по значению, а значит, изменения переменной massiv внутри функции не видны снаружи. Если это учебное задание, придумывайте сами, как выкручиваться. Если это production-код, наплюйте на ручное управление памятью и переходите на std::vector.

Ответ 3



Прежде всего нет никакого смысла передавать в функцию createArray указатель. int* createArray(int*, int); ^^^^ Параметры функции являются ее локальными переменными, которые содержат копии аргументов, которые передаются по значению. Проще было бы определить эту функцию следующим образом int * createArray( int number ) //создание динамического массива { return new int[number]; } По этой же причине функция addElemet либо должна возвращать указатель на вновь созданный массив, либо параметр massiv следует объявить как ссылку. К тому же значение переменной, задающей размер массива, также должно измениться. Кроме того непонятно, почему в этом цикле выражение massiv[i] закомментировано, а вместо него используется выражение i. for (int i = 0; i < number; i++) { temp[i] = i; //massiv[i]; // копируем данные со старого массива sum += massiv[i]; } И в этом предложении temp[numTemp] = sum; происходит выход за границу допустимых индексов для массива. Так как последний допустимый индекс - это numTemp - 1. И в этих предложениях massiv = createArray(temp, numTemp); //... deleteArray(temp); //удаляем временный массив нет смысла. Я бы определил эту функцию следующим образом int addElemet( int * &massiv, int number ) //добавление элемента в конец массива { int *temp = createArray( number + 1 ); int sum = 0; for ( int i = 0; i < number; i++) { temp[i] = massiv[i]; sum += massiv[i]; // или можно записать в одну строчку // sum += temp[i] = massive[i]; } temp[number] = sum; deleteArray( massiv ); // удаляем старый массив massiv = temp; //копируем временный массив в новый. return number + 1; } В main вызов этой функции будет выглядеть как num = addElemet(pArray, num); Не забудьте также изменить объявления измененных фукнуий перед main int * createArray( int number ); int addElemet( int * &massiv, int number ); Также в main переменная sum не используется и может быть удалена.

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

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