Инструменты пользователя

Инструменты сайта

Writing /var/www/qsp.su/public_html/wiki/data/meta/access.log failed

Боковая панель

howto:arrays

Продвинутое использование массивов

Двумерные массивы с числовыми индексами

Пример симуляции двумерного массива

! Индексы i1  0..8
i1_max=9    

! Индексы i2  0..5
i2_max=6

! Заполнение данных массива 
i1=0
:ПрыгЗадатьМассив1
	i2=0
	:ПрыгЗадатьМассив2
		$ДвумерныйМассив[i1*i2_max+i2]='[<<i1>>,<<i2>>]'
		i2+=1
	if i2<i2_max : Jump 'ПрыгЗадатьМассив2'
i1+=1
if i1<i1_max : Jump 'ПрыгЗадатьМассив1'


! Вывод данных массива
i1=0
:ПрыгВыводМассива1
	*Nl 
	i2=0
	:ПрыгВыводМассива2
		*P $ДвумерныйМассив[i1*i2_max+i2]+'  '
		i2+=1
	if i2<i2_max : Jump 'ПрыгВыводМассива2'
i1+=1
if i1<i1_max : Jump 'ПрыгВыводМассива1'
*Nl 

!{Результат 
[0,0]  [0,1]  [0,2]  [0,3]  [0,4]  [0,5]  
[1,0]  [1,1]  [1,2]  [1,3]  [1,4]  [1,5]  
[2,0]  [2,1]  [2,2]  [2,3]  [2,4]  [2,5]  
[3,0]  [3,1]  [3,2]  [3,3]  [3,4]  [3,5]  
[4,0]  [4,1]  [4,2]  [4,3]  [4,4]  [4,5]  
[5,0]  [5,1]  [5,2]  [5,3]  [5,4]  [5,5]  
[6,0]  [6,1]  [6,2]  [6,3]  [6,4]  [6,5]  
[7,0]  [7,1]  [7,2]  [7,3]  [7,4]  [7,5]  
[8,0]  [8,1]  [8,2]  [8,3]  [8,4]  [8,5]  
}

!Получение индексов массива через функцию ARRPOS

$Поиск='[2,5]'

i1=ARRPOS('$ДвумерныйМассив',$Поиск)/i2_max
i2=ARRPOS('$ДвумерныйМассив',$Поиск) mod i2_max

if ARRPOS('$ДвумерныйМассив',$Поиск)<>-1 :
	 *Nl $Поиск+'=[<<i1>>,<<i2>>]' 
else 
	*Nl 'Элемент не найден'
end
!{Результат 
[2,5]=[2,5]
}

В данном примере использованы функции:

Двумерные массивы с текстовыми индексами

Пример работы с массивом имеющим текстовые индексы

! Индексы i1  0..3
i1_max=4    

! Индексы i2  0..5
i2_max=6

! Заполнение данных массива 
i1=0
:ПрыгЗадатьМассив1
	i2=0
	:ПрыгЗадатьМассив2
		! Знак двоеточие используется как разделитель 
		! между двумя численными индексами переведенными в текст
		$ДвумерныйМассивТекстовыйИндекс['<<i1>>:<<i2>>']='[<<i1>>,<<i2>>]'
		! $МассивИндекс нужен для дальнейшего поиска через ARRPOS/ARRCOMP
		$МассивИндекс['<<i1>>:<<i2>>']='<<i1>>:<<i2>>'
		! МассивПорядок нужен для использования KILLVAR
		МассивПорядок['<<i1>>:<<i2>>']=ARRSIZE('МассивПорядок')
		! Добавлять новый элемент и удалять нужно 
		!только одновременно в 3х массивах
		
		i2+=1
	if i2<i2_max : Jump 'ПрыгЗадатьМассив2'
i1+=1
if i1<i1_max : Jump 'ПрыгЗадатьМассив1'


! Вывод данных массива
i1=0
:ПрыгВыводМассива1
	*Nl 
	i2=0
	:ПрыгВыводМассива2
		*P $ДвумерныйМассивТекстовыйИндекс['<<i1>>:<<i2>>']+'  '
		i2+=1
	if i2<i2_max : Jump 'ПрыгВыводМассива2'
i1+=1
if i1<i1_max : Jump 'ПрыгВыводМассива1'

*Nl 

!{ Результат 
[0,0]  [0,1]  [0,2]  [0,3]  [0,4]  [0,5]  
[1,0]  [1,1]  [1,2]  [1,3]  [1,4]  [1,5]  
[2,0]  [2,1]  [2,2]  [2,3]  [2,4]  [2,5]  
[3,0]  [3,1]  [3,2]  [3,3]  [3,4]  [3,5]  
}


!Получение индексов массива через функцию ARRPOS
$Поиск='[3,0]'

N=ARRPOS('$ДвумерныйМассивТекстовыйИндекс',$Поиск)
if N<>-1:
	!Ищем разделитель ':'  в индексе
	K=STRPOS($МассивИндекс[N],':')

	i1=VAL(MID($МассивИндекс[N],0,K-1))
	i2=VAL(MID($МассивИндекс[N],K+1,LEN($МассивИндекс[N])-K))

	*NL $Поиск+'=[<<i1>>,<<i2>>]'
else
	*Nl 'Элемент не найден'
end


!{ Результат 
[3,0]=[3,0]
}

*NL
!Удаление элемента массива через текстовый индекс
$Удалить='<<i1>>:<<i2>>'
*NL 'Удаляем элемент с индексом <<i1>>:<<i2>>'

!Получаем номер элемента

N=МассивПорядок[$Удалить]


!Удаляем элемент
KILLVAR '$ДвумерныйМассивТекстовыйИндекс', N
KILLVAR '$МассивИндекс', N
KILLVAR 'МассивПорядок', N

!Еще раз выводим данные массива

i1=0
:ПрыгВыводМассива3
	*Nl 
	i2=0
	:ПрыгВыводМассива4
		if $ДвумерныйМассивТекстовыйИндекс['<<i1>>:<<i2>>']<>'':
			*P $ДвумерныйМассивТекстовыйИндекс['<<i1>>:<<i2>>']+'  '
		else
			*P '[DEL]  '
		end
		i2+=1
	if i2<i2_max : Jump 'ПрыгВыводМассива4'
i1+=1
if i1<i1_max : Jump 'ПрыгВыводМассива3'



!{ Результат
Удаляем элемент с индексом 3:0
[0,0]  [0,1]  [0,2]  [0,3]  [0,4]  [0,5]  
[1,0]  [1,1]  [1,2]  [1,3]  [1,4]  [1,5]  
[2,0]  [2,1]  [2,2]  [2,3]  [2,4]  [2,5]  
[DEL]  [3,1]  [3,2]  [3,3]  [3,4]  [3,5]  
}

В данном примере использованы функции:

Массив переменных

Пример использования индекса в названии массива

! Индексы i1  0..5
i1_max=6    

! Индексы i2  0..2
i2_max=3

! Заполнение данных массива 
i1=0
:ПрыгЗадатьМассив1
	i2=0
	:ПрыгЗадатьМассив2
	!названия заполняемых массивов 
	!$МассивПеременных0 , $МассивПеременных1 , $МассивПеременных2
		DYNAMIC {$МассивПеременных}+i1+{['<<i2>>']='[<<i1>>,<<i2>>]' }
		i2+=1
	if i2<i2_max : Jump 'ПрыгЗадатьМассив2'
i1+=1
if i1<i1_max : Jump 'ПрыгЗадатьМассив1'


! Вывод данных массива
i1=0
:ПрыгВыводМассива1
	*Nl 
	i2=0
	:ПрыгВыводМассива2
		DYNAMIC {*P $МассивПеременных}+i1+{['<<i2>>'] +'  '} 
		i2+=1
	if i2<i2_max : Jump 'ПрыгВыводМассива2'
i1+=1
if i1<i1_max : Jump 'ПрыгВыводМассива1'

!{ Результат 
[0,0]  [0,1]  [0,2]  
[1,0]  [1,1]  [1,2]  
[2,0]  [2,1]  [2,2]  
[3,0]  [3,1]  [3,2]  
[4,0]  [4,1]  [4,2]  
[5,0]  [5,1]  [5,2]   
}

В данном примере использованы функции:


Назад: Как сделать

howto/arrays.txt · Последние изменения: 2015/04/08 01:23 (внешнее изменение)