Консультация № 144350
19.09.2008, 00:52
0.00 руб.
0 1 1
Уважаемы эксперты,помогите пожалуйста сделать код для обработки массива по ниже написанному условию.Мне нужна только часть кода отвечающая для обработки массива,просто никак не могу сообразить как сделать,а все остальное сделаю сам.Зарание спасибо.
Класс «упорядоченный массив» (SortArray) состоит ищ следубщих даннх:
1. Указатель на тип double, представляющий элементы массива;
2. Указатель на тип intб представляющий индексы элементов массива;
3. Размерность массива;
4. Текущее количество элементов в массиве;
Элементы массива неупорядочены, т.е. каждый добавляемый элемент помещается в конец массива. При этом элемент массива индексов содержит порядковый номер элемента массива данных. Например, для массива 5,-1,2,-4 массив индексов при сортировке по убыванию должен быть таким: 3,1,2,0. Таким образом,в массиве индексов на первом месте должен стоять индекс наименьшего элемента, на втором – следующего по величене и т.д. Если обозначить А – массив,Ind – массив индексов,то A[inf[i]] – значение i-ого по порядку элемента массива. При этом операция индексации для пользователя A[i] должна интерпретироваться как A[ind[i]] и не позволять изменять элемент массива.
Определить следующие функции для работы с упорядоченными массивом.
«Добавление произвольного элемента в массив и удаления произвольного элемента из массива так, чтобы не нарушалось упорядоченность.»

Обсуждение

Неизвестный
19.09.2008, 03:23
общий
это ответ
Здравствуйте, Arias!
При ответе на Ваш вопрос у меня возник свой, а что еще кроме работы с массивами должно быть в этой программе, что бы это "остальное" Вы доделали сам? :)

Все разъяснения даны в виде комментариев по месту в коде.


Приложение:
class SortArray
{
public:
SortArray(int size);
~SortArray();

void add(double num);
void erase(int idx);

double operator[] (int i) const {
if(i >= 0 && i < size_)
return num_[idx_[i]];
return 0;
}

private:
double* num_;
int* idx_;

int size_;
int capacity_;
};


SortArray::SortArray(int size)
{
capacity_ = size;

// выделяем память под массивы
num_ = new double[capacity_];
idx_ = new int[capacity_];

size_ = 0;
}

SortArray::~SortArray()
{
// освобождаем память выделенную под массивы
delete[] num_;
delete[] idx_;
}

void SortArray::add(double num)
{
if(size_ >= capacity_)
return; // больше места нету

num_[size_] = num; // добавляем в конец

// теперь ищем позицию по порядку
// нужен номер индекса первого из чисел, которые больше добавляемого
// если чисел еще нет - вернется индекс 0
// если все хранимые числа меньше - вернется размер
int pos = 0;
for(; pos < size_; ++pos)
if(num_[idx_[pos]] > num)
break;

// теперь на место pos в индексах нам нужно вставить номер числа
// это означает, что все числа начиная с pos - нужно сдвинуть вперед
// двигаем начиная с последнего, что бы не затереть нужной информации
for(int i = size_; i > pos; --i)
idx_[i] = idx_[i - 1];

// теперь записываем наш индекс на освободившееся место
idx_[pos] = size_;

// теперь хранится на одно число больше
++size_;
}

void SortArray::erase(int pos)
{
if(pos < 0 || pos >= size_)
return; // это за пределами

int del = idx_[pos];
// нужно удалить число с позици del, для этого все последующие числа надо сдвинуть назад
for(int i = del; i < size_; ++i)
num_[i] = num_[i + 1];

// теперь нужно скорректировать индексы
// 1. удалить индекс с позиции pos (аналогично удалению числа)
for(int i = pos; i < size_; ++i)
idx_[i] = idx_[i + 1];

// 2. скорректировать те индексы, которые ссылались на числа стоящие после удаленного,
// т.к. теперь они на однц позицию ближе
for(int i = 0; i < size_; ++i)
if(idx_[i] > del)
--idx_[i];

//теперь хранится на одно число меньше
--size_;
}
Форма ответа