Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
MayaNash
1291 / 459 / 151
Регистрация: 24.08.2011
Сообщений: 2,247
#1

Ошибка после удаления элемента из массива

19.12.2013, 20:17. Просмотров 330. Ответов 2

После функции Delete выводится уже далеко не то, что должно было остаться, компилятор не пишет ничего вразумительного. В чем ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "stdafx.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <conio.h>
 
template <class Type>
class Array
{
private:
    Type *theArray;
    int size;
    Type operator[](int n) const; // возвращает значение элемента с порядковым номером n
public:
    Array(); // конструктор по умолчанию
    Array(Type); // конструктор по значению информационного поля
    Array(const Array &); // конструктор-копировщик
    ~Array(); // деструктор
    int GetSize() const; // возвращает размер массива
    void operator += (Type value); // добавляет в конец элемент value
    void Print() const; // выводит на экран
    void Add(Type value); // добавляет в конец элемент value
    int Find(Type value) const; // находит номер элемента (номера начиная с 1), если такого элемента нет, 0
    void Delete(int); // удаляет элемент с заданным номером (номера начиная с 1)
};
 
int main()
{
    Array<int> a(5); // инициализируем массив элементом 5
    a += 6; // добавляем элемент 6
    a.Add(7); // добавляем элемент 7
    a.Print(); // выводим на экран
    cout << "Nomer elementa '7': " << a.Find(7) << endl;
    cout << "Nomer elementa '3': " << a.Find(3) << endl;
    cout << "Udalim element nr.2..." << endl;
    a.Delete(2);
    a.Print();
    getch();
    return 0;
}
 
template <class Type> // конструктор по умолчанию
Array<Type>::Array(): size(0), theArray(NULL)
{
}
 
template <class Type> // конструктор по значению информационного поля
Array<Type>::Array(Type value): size(1)
{
    theArray = new Type;
    theArray[0] = value;
}
 
template <class Type> // конструктор-копировщик
Array<Type>::Array(const Array &theObject)
{
    size = theObject.GetSize();
    theArray = new Type[size];
    for (int i = 0; i < size; i++)
        theArray[i] = theObject[i]; // и копируем все элементы
}
 
template <class Type> // возвращает размер массива
int Array<Type>::GetSize() const
{
    return size;
}
 
template <class Type> // возвращает значение элемента с порядковым номером n
Type Array<Type>::operator[](int n) const
{
    return theArray[n];
}
 
template <class Type>
void Array<Type>::operator+=(Type value)
{
    Array<Type> tmp(*this); // сохраняем текущий массив
    delete [] theArray; // освобождаем память
    size++; // увеличиваем размер
    theArray = new Type[size]; // создаем новый массив
    for (int i = 0; i < size-1; i++)
        theArray[i] = tmp[i]; // копируем уже имеющиеся элементы
    theArray[size-1] = value; // и добавляем новый
}
 
template <class Type> // деструктор
Array<Type>::~Array()
{
    delete [] theArray;
}
 
template <class Type>
void Array<Type>::Print() const
{
    cout << "Size: " << size << endl << "Array: ";
    for (int i = 0; i < size; i++)
        cout << theArray[i] << " ";
    cout << endl;
}
 
template <class Type>
void Array<Type>::Add(Type value)
{
    Array<Type> tmp(*this); // сохраняем текущий массив
    delete [] theArray; // освобождаем память
    size++; // увеличиваем размер
    theArray = new Type[size]; // создаем новый массив
    for (int i = 0; i < size-1; i++)
        theArray[i] = tmp[i]; // копируем уже имеющиеся элементы
    theArray[size-1] = value; // и добавляем новый
}
 
template <class Type>
int Array<Type>::Find(Type value) const
{
    for (int i = 0; i < size; i++)
        if (theArray[i] == value)
            return i+1;
    return 0;
}
 
template <class Type>
void Array<Type>::Delete(int n)
{
    if ((n < 1) || (n > size))
        return;
    Array<Type> tmp;
    for (int i = 0; i < size; i++)
        if (i != n-1)
            tmp.Add(theArray[i]);
    delete [] theArray;
    size--;
    for (int i = 0; i < size; i++)
        theArray[i] = tmp[i];
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2013, 20:17
Ответы с готовыми решениями:

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

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

Реализовать приложение, содержащее функции добавления нового элемента в массив и удаления элемента из массива. (Имитируется “резиновый” массив)
Реализовать приложение, содержащее функции добавления нового элемента в массив...

Алгоритм удаления элемента из массива
Помогите написать код:( Условие задачи таково: Заменить максимальный элемент...

Объясните код удаления элемента массива
Прошу объяснить строки кода и используемые переменные при удалении элемента...

2
Surgery
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32
19.12.2013, 20:21 #2
C++
1
   delete [] theArray;
Освободил память и отдал ее системе
C++
1
        theArray[i] = tmp[i];
А затем пытаешься писать в нее что то
1
MayaNash
1291 / 459 / 151
Регистрация: 24.08.2011
Сообщений: 2,247
19.12.2013, 20:49  [ТС] #3
Аа, блин, точно)) Спасибо)

Добавлено через 27 минут
Surgery, такой вопрос, почему со string это не работает?
C++
1
2
3
4
5
6
7
8
9
10
11
        cout << "Massiv string" << endl;
    Array<string> c("Stroka1");
    c += "Stroka2";
    c.Add("Stroka3");
    c.Print();
    cout << "Nomer elementa 'Stroka1': " << c.Find("Stroka1") << endl;
    cout << "Nomer elementa 'Stroka': " << c.Find("Stroka") << endl;
    cout << "Udalim element nr.2..." << endl;
    c.Delete(2);
    c.Print();
    getch();
Возникает ошибка в операторе +=, при удалении массива, почему?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2013, 20:49

Напишите функцию удаления элемента из массива
Дан массив А из n целых чисел. Напишите функцию удаления элемента из массива,...

Функция удаления элемента из дерева, ошибка в коде
Добрый вечер, уважаемые программисты! :) Помогите, пожалуйста, понять где...

Эффективные алгоритмы вставки и удаления элемента из массива
Необходимы два эти алгоритма. + Всем в карму


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru