Задачка с массивом

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

Задачка с массивом

Сообщение netdemon » 23.10.2007 (Вт) 15:24

Вот такая у меня нарисовалась задачка:

Есть массив из 64 элементов

Каждый элемент массива необходимо характеризовать пересечением 2 х координат Строка, столбец. Всего 8 строк и 8 столбцов. А так же необходимо произвести обратную операцию. Т.е. По номеру строки и столбца узнать индекс элемента массива. Как я только не пытался. Ничего не получается. :(
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.10.2007 (Вт) 15:29

А если номер строки умножить на 8 и плюс номер столбца?
Подпись проходит рефакторинг

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 23.10.2007 (Вт) 15:34

т.е. имитируем 2-мерный массив 1-мерным?
Элементарно:

i1 = 8*i + j

где i и j - индексы двумерного массива, а i1 индекс одномерного

Обратый вариант:

i = i1\8 - 1
j = i1 - (i +1)*8

З.Ы. Нумерация начинается с 0
З.Ы. Писано по памяти, могу и обшибицца
Весь мир матрица, а мы в нем потоки байтов!

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 23.10.2007 (Вт) 15:40

Lumen писал(а):А если номер строки умножить на 8 и плюс номер столбца?


САм то это пробовал?
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 23.10.2007 (Вт) 17:18

По поводу пробовал или нет - легко, могу даже при всех попробовать...

O 0 1 2 3 4 5 6 7
0 X X X X X X X X
1 X X X X X X X X
2 X X X X X X X X
3 X X X X X X X X
4 X Z X X X X X X
5 X X X X X X X X
6 X X X X X X X X
7 X X X X X X X X

К примеру это наш двумерный массив (каждый элемент его характеризуется пересечением двух координат). К примеру элемент массива Z характерихуется координатами 1 и 4. (Второй столбик, пятая строка). Нам нужно узнать каким он будет идти по счету, начиная от верхнего левого угла. Что же нам теперь делать?
Мы видим, что от верхнего левого угла наш элемент отделяет 4 полных строки (на пятой находится сам элемент) если идти по вертикали и 1 столбец если идти по горизонтали (второй - это столбец с нашим элементом). Не, ну блин, видеть-то мы все видим, скажешь ты, а как же найти каким он будет идти по счету? А очень просто. Умножаем 4 (5-1=4) полных строки на 8 и прибавляем 1 (потому что во втором столбце находится наш элемент, но нумерация с нуля). В итоге, о чудо! мы получили что наш элемент идет 33-ым по списку. Если это все перевести на язык формул, то получим формулу очень похожую на ту, что написал Viper а именно k = 8*i + j, где k - индекс одномерного массива, i - номер строки в матрице, а j - номер столбца.
Что собственно я и написал:
Lumen писал(а):А если номер строки умножить на 8 и плюс номер столбца?

Это ответ на твой второй вопрос. Ответ на первый плавно вытекает из ответа на второй вопрос. Ведь для умножения обратная операция - деление. То есть чтобы нам этот индекс одномерного массива каким-то образом превратить в номер строки и номер столбца. Чтобы найти номер строки делим нацело наш индекс ( i = k \ 8 ) а чтобы найти номер столбца находим остаток от деления индекса одномерного массива на 8 ( j = k mod 8 ). Что в принципе тоже очень похоже на формулу, двумя постами выше.
Подпись проходит рефакторинг

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 23.10.2007 (Вт) 17:51

Lumen писал(а):А если номер строки умножить на 8 и плюс номер столбца?


Именно такой способ используется в MSHFlexGrid.TextArray, например.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 23.10.2007 (Вт) 19:36

Автор странен. Он получил от меня
НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:27) :
Просто не могу одну задачку решить закавыристую.

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:28) :
А ты специалист по решению всяких задачек связанных с математикой

Владислав Петровский (18:28) :
Это вопрос?

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:28) :
Это комплимент. <###20###img011>

Владислав Петровский (18:29) :
Спасибо

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:29) :
Туго у меня с математикой.<###20###img013>

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:32) :
Может поможешь? Хотя бы подскажи от чего плясать.

Владислав Петровский (18:32) :
ну попробуй задать вопрос

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:32) :
Есть массив из 64 элементов

Каждый элемент массива необходимо характеризовать пересечением 2 х координат Строка, столбец. Всего 8 строк и 8 столбцов. А так же необходимо произвести обратную операцию. Т.е. По номеру строки и столбца узнать индекс элемента массива.

Владислав Петровский (18:33) :
фии... я же уже отвечал на этот вопрос

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:33) :
Когда?<###20###img025>

Владислав Петровский (18:34) :
http://bbs.vbstreets.ru/viewtopic.php?t=34487

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:52) :
retval.uLine = (index \ 8) + 1
retval.uColumn = 1 + ((index) Mod 8)

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:52) :
Вот так работает. У меня массив с 0 индеском

НЕ ИЗВЕСНЫЙ НАУКЕ ЗВЕРЮГА (18:54) :
А обратно?

Владислав Петровский (18:54) :
index = retval.uLine*8 + retval.uColumn


Тем не менее, автор не попросил удалить или закрыть там тему.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 24.10.2007 (Ср) 18:18

Хакер

Немного подправил твой вариант и дописал вариант обр. преобразования.


Код: Выделить всё

Public Function PosToIndex(up As UPOS) As Integer

     PosToIndex = (up.uLine - 1) * 8 + (((up.uColumn - 1) Mod 8))
End Function

Public Function IndexToPos(ByVal Index As Integer) As UPOS
Dim retval As UPOS
  retval.uLine = (Index \ 8) + 1
  retval.uColumn = 1 + ((Index) Mod 8)
    IndexToPos = retval
End Function

Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 26.10.2007 (Пт) 12:15

netdemon писал(а):Хакер

Немного подправил твой вариант и дописал вариант обр. преобразования...

Ты токо сразу объявление UPOS приведи.. А то мало ли.. Например:
Код: Выделить всё

Type UPOS
    uLine as Integer
    uColumn as Integer
End Type
label:
cli
jmp label

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 28.10.2007 (Вс) 13:59

iGrok

Да. Именно так. 8)
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.


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

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

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

    TopList  
cron