Как удалить елемент из массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mckoy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 20.06.2002 (Чт) 10:54

Как удалить елемент из массива

Сообщение Mckoy » 05.10.2004 (Вт) 12:19

Мне нужно реализовать простую задачу: Есть колода из 52 карт. Одну карту забрали. Теперь надо обновить колоду, чтобы карты этой в ней не было.
Все это безобразие решил реализовать через массивы. (Если есть лучший споосб буду рад услышать). Если способ удалить элемент из массива? или надо его переопределять?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.10.2004 (Вт) 12:20

Коллекции юзай. Коллекции.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mckoy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 20.06.2002 (Чт) 10:54

Сообщение Mckoy » 05.10.2004 (Вт) 12:26

В моем справочние по ВБ есть только описание коллекций применительно к элементам управления. Можно по-точней?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.10.2004 (Вт) 12:42

dim cards as collection
set cards=new collection
cards.add "шестёрка пик", "6п"
cards.add "семёрка пик", "7п"

...

cards.remove "7п"
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tuco
Постоялец
Постоялец
 
Сообщения: 508
Зарегистрирован: 18.06.2003 (Ср) 16:37
Откуда: Подмосковье

Сообщение Tuco » 05.10.2004 (Вт) 12:47

Создаёшь коллекцию, myCollection.add, который добавляет элементы (в твоём случае - карты, по одной). Когда ты берёшь карту из коллекции, используешь myCollection.remove, при котором из коллекции элемент удаляется. Получаешь значение карты - myCollection.item. Колличество карт в колоде - myCollection.Count.
"There's more than one way to do it!"

Mckoy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 20.06.2002 (Чт) 10:54

Сообщение Mckoy » 05.10.2004 (Вт) 12:48

Спасибо GSerg и Tuco, попробую.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 05.10.2004 (Вт) 13:51

Можно было и через массивы... Поставить флажок на номер используемой карты.
А при генерации колоды флаг обнулять!

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 05.10.2004 (Вт) 15:35

А что, есть проблеммы удалять элемент из динамического массива?

Код: Выделить всё
for i=k to n-1
a(i) =a(i+1)
next i
n=n-1
redim preserve a(1 to n)


Где к - индекс удаляемой ячейки. n количество ячеек. Если есть проблема с динамическим массивом строчьку redim preserve a(1 to n) не используй для обычного. а количество ячеек у тебя как бы уменьшится

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.10.2004 (Вт) 20:38

Vitaly1 писал(а):А что, есть проблеммы удалять элемент из динамического массива?

Код: Выделить всё
for i=k to n-1
a(i) =a(i+1)
next i
n=n-1
redim preserve a(1 to n)


Где к - индекс удаляемой ячейки. n количество ячеек. Если есть проблема с динамическим массивом строчьку redim preserve a(1 to n) не используй для обычного. а количество ячеек у тебя как бы уменьшится
Где-то тут недалеко обсуждалось использование для этого CopyMemory вместо цикла...
Изображение

Mckoy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 20.06.2002 (Чт) 10:54

Сообщение Mckoy » 06.10.2004 (Ср) 5:08

Спасибо всем, оба варианта получились. Я все таки остановился на массиве.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.10.2004 (Ср) 9:13

CopyMemory не подойдет при наличии строк переменной длины в массиве.
Lasciate ogni speranza, voi ch'entrate.

Mckoy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 20.06.2002 (Чт) 10:54

Сообщение Mckoy » 06.10.2004 (Ср) 9:22

А если все стороки из 2х символв?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.10.2004 (Ср) 9:32

Если они определены, как строки фиксированной длины (.Code As String*2), то можно. А иначе наврядли.
А нельзя ли заменить эти двухсимвольные строки на числовой идентификатор? В крайнем случае, перегоняй строки в Long (AscW(Mid$(.Code,1,1))*65536& + AscW(Mid$(.Code,2,1))).
Lasciate ogni speranza, voi ch'entrate.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 06.10.2004 (Ср) 11:22

Так как карт всего <=54 (а вообще то <=53, 1 джокер запасной!) то нельзяли в качестве массива спользовать строку?

'добавление номера карты в колоду
s= s+chr(Номер_карты)

'укаление "к" карты из колоды
s = Mid(s, 1, k - 1) + Mid(s, k + 1)

'получение Номера "к" карты
Номер_карты = asc(mid(s,k,1))

Mckoy
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 20.06.2002 (Чт) 10:54

Сообщение Mckoy » 06.10.2004 (Ср) 11:34

alibek, Vitaly1
А зачем такие умние функции и преобразования? для быстродействия? Я пока в них не разбираюсь и пытаюсь только заставить программу хотя бы работать.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 06.10.2004 (Ср) 13:38

Не только для быстродействия, код проще становится.

Впрочем, если пока не понятно, делай так, как ты понимаешь!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.10.2004 (Ср) 13:40

alibek писал(а):CopyMemory не подойдет при наличии строк переменной длины в массиве.

Конечно же подойдёт, только нужно перед сдвигом обменять местами последний и удаляемый элемент. Ну, или руками удалить удаляемый и затереть нулём последний. И то, и другое - по две строчки кода. Какие проблемы-то?
Изображение

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 06.10.2004 (Ср) 14:09

Vitaly1 писал(а):Не только для быстродействия, код проще становится.

Код проще при работе со строкой???? Да вы чего!? Его отлаживать будешь годами!

tyomitch писал(а):Конечно же подойдёт, только нужно перед сдвигом обменять местами последний и удаляемый элемент...

Ну не надо использовать низкоуровневые функции для работы с памятью, где этого не требуют условия жесткой необходимости! CopyMemory для удаления элемента из массива! Придумали тоже...

Пишите класс для карты и колоды, если вам чего-то не хватает, и будьте счастливы!
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList