Что нового

проверка диапазона значений

saraconor

Новичок
Сообщения
404
Репутация
3
необходимо проверить сразу несколько строк в массиве, получается слишком громоздко:
Код:
if ($array[1] = "A4") or ($array[2] = "A4") or ($array[3] = "A4") or ($array[4] = "A4") or ($array[5] = "A4") or ($array[6] = "A4")....

Как устроить нечто вроде
Код:
if ($array[1-60]) then
?
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
Local $array[5]

$array[0] = "A4"
$array[1] = "A4"
$array[2] = "A3"
$array[3] = ""
$array[4] = "A1"

For $i = 0 to UBound($array)-1
	If $array[$i] Then
		ConsoleWrite($i&@CRLF)
	EndIf
Next

For $i = 0 to UBound($array)-1
	If $array[$i]="A4" Then
		ConsoleWrite($i&' = "A4"'&@CRLF)
	EndIf
Next


В случае с "OR" думаю можно использовать так:
Код:
For $i = 0 to UBound($array)-1
	If $array[$i]= "A4" Then
		ConsoleWrite($i&' = "A4"'&@CRLF)
		ExitLoop
	EndIf
Next

т.к. оператор IF все равно выполнится один раз... И в выше указанном примере мы как раз выходим из цикла...
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
2 AZJIO
Код:
if ($array[1-60]) then

цЫферка "60" пугает ))))))
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
---Zak---
Я за скорость больше переживаю, чем за длинну записи. Хотя тут важно в каком контексте рассматривать такой алгоритм. Например если это проверка элементов управления, то всё гораздо проще
Код:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $BoxConfig[1] To $BoxConfig[$BoxConfig[0]]
			$j = $nMsg - $BoxConfig[1] + 1
			MsgBox(0, 'Check', $j, 0, $hGui)
		Case -3
			Exit
	EndSwitch
WEnd


Если рассматривать "A4" как формат листа, то там тоже не 60 форматов и инфа о 60 была возможно преувеличена и просто дана до кучи. Поэтому не будем гадать. Конструкция Switch передаёт данные интерпретатору и он уже внутренним движком намного быстрее сравнивает, чем интерпретация 60 раз условия внутри цикла.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
По поводу скорости. Сравнение целых чисел происходит намного быстрее строк. Поэтому, если логика задачи позволяет заменить строковые значения в массиве на их условные числовые обозначения ("A4" - 1, "A3" - 2 и т.д.), то такой подход сильно выиграет по части скорости сравнения, если это имеет какой-то смысл.
 

gora

Знающий
Сообщения
315
Репутация
19
saraconor
Может так?
Код:
#include <Array.au3>
Local $array[6] = ["A1", "A2", "a4", "2A4", "A4", "3A4"]

$iIndex = _ArraySearch($array, "A4",0,0,1)
If @error Then
    MsgBox(4096, "Не найдено", '"A4" не был найден в массиве.')
Else
    MsgBox(4096, "Найдено", '"A4" найден в массиве в позиции ' & $iIndex & ".")
EndIf
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
2 AZJIO
На счет столько форматов - согласен... формат один, но файлов с таким форматом может быть на порядок. Возможно задача состоит в том, что мы имеем массив информации о файлах и в "одной из колонок" как раз и стоит формат файлов.
Возможная идея реализации: идет учет печати на принтере со сводкой формата и кол-ва листов. Далее из списка необходимо получить - сколько в месяц было необходимо напечатать формат "А4"...

Но гадать зачем автору такое условие - не охота... проще спросить)))))
На счет операторов...кому что удобнее и кто как привык - придумать можно все, но это так - к слову)))) Я же ничего против не имею твоего примера.

ЗЫ: пойду попробую написать как ты предложил - вдруг понравиться))))
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Спасибо за примеры, буду думать как половчее использовать.
 
Верх