Консультация # 185990: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Проблема в следующем, вот код который я прилогаю ниже (ОС -Win, система разработки - Microsoft Visual C++ 2010 Express edition, таблица просматриваемая) Структуру каждого элемента таблицы можно увидеть в коде, предусматриваю следующие операции: = включение новог...
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Проблема в следующем, вот код который я прилогаю ниже (ОС -Win, система разработки - Microsoft Visual C++ 2010 Express edition, таблица просматриваемая)
Структуру каждого элемента таблицы можно увидеть в коде, предусматриваю следующие операции: = включение нового элемента в таблицу при условии, что в таблице могут находиться несколько элементов с одинаковыми ключами и разными номерами версий(номер версии элемента формируется
как порядковый номер элемента в последовательности элементов с одинаковыми ключами, определяемый при включении элемента в таблицу); с этим небольшая проблема понимания, а точнее переложения в код, опять же в коде она эта функция есть но она не так работает(добавляет корректно, некоретно версии изменяются). =поиск в таблице я сделал! =чистка таблицы сжатием - удаление из таблицы путем ее сжатия всех версий элементов, кроме последних; сделал но не понимаю как
уже удалить этот элемент точнее поле или структуру, опять же в коде это представлено, но не доделано( = ну и вывод я сделал Сам код
помогите сделать корректное изменение версии ключа, то есть, если ключи 1 1 1 1 1, тогда версии, как я понял 1 2 3 4 5, или если 1 1 2 3 4, тогда версии 1 2 1 1 1 и помогите пожалуйсто сделать корректное удаление или уничтожение элемента как видите тут замещение сделано а как избавиться от поля или от элемента, так называемого, я не понял немного. Большое спасибо! Нельзя использовать СТЛ, ООП. Все стандартно как написано у меня пожалуйсто
Здравствуйте, Посетитель - 392815! Весь код не предоставляю, т.к. задача стояла в помощи написания функций. Их и обсудим. Судя по Вашему коду - есть таблица фиксированного размера, где элемент таблицы признаётся пустой, если поле info пустое, т.е. первый байт имеет значение нуля. Поэтому удаление элемента выглядит просто:
Код :
void del_item(int index) //Удаление элемента с номером index
{
itemi[index].info[0]=0;
cout << "Element " << index <<" deleted" << '\n';
}
void del()//удаление элемента указываемого по ключу и версии
{
int i,k,r,j;
cout << "Key: ";
cin >> k;
cout << "Release: ";
cin >> r;
for(i = 0; i < SIZE; i++) //Пробежимся по всем элементам в поисках указанного
if(itemi[i].key == k && itemi[i].release == r) del_item(i); //При совпадении удалить
}
Заметьте, тут добавлена функция стирания элемента по индексу: del_item(int index). Она ещё понадобится.
Заполняется таблица в первый найденный свободный элемент с пустым info, сортировка не предусмотрена. Проверка на совпадение ключа и увеличение версии происходит так:
Код :
void proverka(int i)//проверка ключей
{
int j,k;
int MaxRelease=0;
for(j=0; j < SIZE; j++) //Сравним со всеми ключами
if((i!=j && *itemi[j].info && itemi[i].key == itemi[j].key && itemi[j].release>MaxRelease))
MaxRelease=itemi[j].release; //Если ключи совпали и версия выше, то запомним версию
itemi[i].release=MaxRelease+1; //Новая версия ключа
}
Изменилось объявление функции. Появился аргумент - индекс добавленного элемента. Вызов функции, надеюсь, сами сможете поправить.
Теперь новая функция, отсутствующая в Вашем коде, но я счёл необходимым её присутствие. Это сжатие (компрессия) как я её понял. Её работа заключается в удалении всех ключей с меньшими версиями:
Код :
void compress() //Сжатие версий (удаление всех версий кроме последней)
{
cout << "Compress" << '\n';
int i,j;
for(i=0; i<SIZE; i++) { //Пробежимся в таблице по ключам
if (*itemi[i].info) { //Если элемент не пуст
int MaxRelease=i; //Номер ключа с максимальной версией
for(j=i+1; j<SIZE; j++) { //Пробежимся по таблице в поиске таких же ключей
if (*itemi[j].info && itemi[MaxRelease].key==itemi[j].key) { //Совпадение ключей
if (itemi[MaxRelease].release<itemi[j].release) { //Попался ключ с большей версией
del_item(MaxRelease); //Удалим меньшую версию
MaxRelease=j; //Запомним бОльшую версию
} else {
del_item(j); //Удалим меньшую версию
}
}
}
}
}
}
Дополнительные комментарии присутствуют в коде. Если Вы нуждаетесь и модераторы и другие эксперты сочтут необходимым выложить весь код, то выложу минифоруме. Но если код, размещённый в вопросе Вы писали сами, то Вам не составит труда интегрировать мои исправления в него.
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!