Что нового

Значение массива по условию

joparezzz

Новичок
Сообщения
65
Репутация
0
Имеется массив состоящий из трех столбцов: "Наименование", "минимальное значение", "максимальное значение".
Задается диапазон чисел, необходимо вывести все наименования массивов значения которых лежат в пределах диапазона.
Пока сделал так, см. код ниже.
Но, думаю, есть другие подходы для решения данной задачи.
Т.к. если прописывать все варианты в условии код будет не оптимальным.

Код:
#include <Array.au3>

Dim $TCM = 	[["ТСМ 20/0+5-12", 5, 12], _
			["ТСМ 30/0+13-23", 13, 23], _
			["ТСМ 40/0+23-33", 23, 33], _
			["ТСМ 60/0+34-51", 34, 51], _
			["ТСМ 90/0+52-78", 52, 78], _
			["ТСМ 120/0+79-99", 79, 99]]


;_ArrayDisplay($TCM)

$dn = 13
$dk = 50

For $i = 0 To UBound($TCM) - 1

		If  $dn >= $TCM[$i][1] And $dn <= $TCM[$i][2] And $dk <= $TCM[$i][2] Then
			ConsoleWrite($dn & "-" & $dk & ":" & @TAB  & $TCM[$i][0] & @CRLF)
                ExitLoop

		ElseIf $dn >= $TCM[$i][1] And $dn <= $TCM[$i][2] And $dk > $TCM[$i][2] And $dk <= $TCM[$i+1][2] Then
			ConsoleWrite($dn & "-" & $dk & ":" & @TAB  & $TCM[$i][0] & " и " & $TCM[$i+1][0] & @CRLF)
                ExitLoop

		ElseIf $dn >= $TCM[$i][1] And $dn <= $TCM[$i][2] And $dk > $TCM[$i][2] And $dk > $TCM[$i+1][2] And $dk <= $TCM[$i+2][2] Then
			ConsoleWrite($dn & "-" & $dk & ":" & @TAB  & $TCM[$i][0] & " и " & $TCM[$i+1][0] & " и " & $TCM[$i+2][0] & @CRLF)
                ExitLoop

		EndIf
Next
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Откорректировала скрипт, но сейчас выводит наименования первого и последнего массива.
Как вывести промежуточные наименования в пределах диапазона?
Код:
#include <Array.au3>

Dim $TCM = 	[["ТСМ 20/0+5-12", 5, 12], _
			["ТСМ 30/0+13-23", 13, 23], _
			["ТСМ 40/0+23-33", 23, 33], _
			["ТСМ 60/0+34-51", 34, 51], _
			["ТСМ 90/0+52-78", 52, 78], _
			["ТСМ 120/0+79-99", 79, 99]]

;_ArrayDisplay($TCM)

$dn = 12
$dk = 50

For $i = 0 To UBound($TCM) - 1
		If  $dn >= $TCM[$i][1] And $dn <= $TCM[$i][2] Then
			$n = $TCM[$i][0]
			For $j = 0 to UBound($TCM) - 1
				If  $dk >= $TCM[$i+$j][1] And $dk <= $TCM[$i+$j][2] Then
					$k = $TCM[$i+$j][0]
				ExitLoop
				Else
				EndIf
			Next
		Else
		EndIf
Next

ConsoleWrite($dn & "-" & $dk & ":" & @TAB  & $n & " - " & $k & @CRLF)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
вывести все наименования массивов значения которых лежат в пределах диапазона
Код:
#include <Array.au3>

Dim $TCM =  [["ТСМ 20/0+5-12", 5, 12], _
            ["ТСМ 30/0+13-23", 13, 23], _
            ["ТСМ 40/0+24-33", 24, 33], _
            ["ТСМ 60/0+34-51", 34, 51], _
            ["ТСМ 90/0+52-78", 52, 78], _
            ["ТСМ 120/0+79-99", 79, 99]]

$dn = 12
$dk = 50

If $dn >= $dk Then Exit ConsoleWrite("Некорректный диапазон" & @CRLF)
ConsoleWrite($dn & "-" & $dk & ":" & @CRLF)

For $i = 0 To UBound($TCM) - 1
  If $dn <= $TCM[$i][1] And $dk >= $TCM[$i][2] Then ConsoleWrite($TCM[$i][0] & @CRLF)
Next
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
не корректно работает, при $dk = 50 должно выводиться "ТСМ 60/0+34-51"


Добавлено:
Сообщение автоматически объединено:

Откорректировал скрипт, вот так вроде все работает правильно:
Код:
#include <Array.au3>

Dim $TCM = 	[["ТСМ 20/0+5-12", 5, 12], _
			["ТСМ 30/0+13-23", 13, 23], _
			["ТСМ 40/0+23-33", 23, 33], _
			["ТСМ 60/0+34-51", 34, 51], _
			["ТСМ 90/0+52-78", 52, 78], _
			["ТСМ 120/0+79-99", 79, 99]]

;_ArrayDisplay($TCM)

$dn = 12
$dk = 50

For $i = 0 To UBound($TCM) - 1
		If  $dn >= $TCM[$i][1] And $dn <= $TCM[$i][2] Then
			For $j = 0 to UBound($TCM) - 1
				If  $dk >= $TCM[$i+$j][1] And $dk <= $TCM[$i+$j][2] Then
					$n = $i
					$k = $i+$j
				ExitLoop
				Else
				EndIf
			Next
		Else
		EndIf
Next

ConsoleWrite($dn & "-" & $dk & ":" & @TAB)
For $t = $n to $k
	ConsoleWrite($TCM[$t][0] & " " )
Next
ConsoleWrite(@CRLF)
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Тут логика такая, $dn, $dk это наружный диаметр кабеля, ТСМ - это кабельный ввод который подходит для данного кабеля.
Т.к. изначально непонятно какой именно кабель надо применять, то задан диапазон наружного диаметра кабеля $dn и $dk .

Например для кабеля диаметром 15-20 мм, подходит кабельный ввод ТСМ 30/0+13-23.
А если задан более широкий диапазон например 25-35 то уже необходимо применить 2 типоразмера кабельных вводов ТСМ 40/0+23-33 и ТСМ 60/0+34-51.



Добавлено:
Сообщение автоматически объединено:

Добавил интерфейс, но че-то не очень корректно работает, мерцает...

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $iInput1
Global $iInput2

GUICreate('Тест', 350, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput1 = GUICtrlCreateInput('12', 10, 10, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nInput2 = GUICtrlCreateInput('25', 10, 40, 150, 20)
GUICtrlSetColor(-1, 0x505050)
$nInput3 = GUICtrlCreateList('', 10, 70, 150, 100)

GUISetState()


Dim $TCM = 	[["ТСМ 20/0+5-12", 5, 12], _
			["ТСМ 30/0+13-23", 13, 23], _
			["ТСМ 40/0+23-33", 23, 33], _
			["ТСМ 60/0+34-51", 34, 51], _
			["ТСМ 90/0+52-78", 52, 78], _
			["ТСМ 120/0+79-99", 79, 99]]

;_ArrayDisplay($TCM)


While 1

	$dn = GUICtrlRead($nInput1)
	$dk = GUICtrlRead($nInput2)


    Select
		Case $dn <> $iInput1
			Cab($iInput1, $dn)

		Case $dk <> $iInput2
			Cab($iInput2, $dk)


    EndSelect

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func Cab($p1, $p2)
	GUICtrlSetData($nInput3, '')
	For $i = 0 To UBound($TCM) - 1
		If  $dn >= $TCM[$i][1] And $dn <= $TCM[$i][2] Then
			For $j = 0 to UBound($TCM) - 1
				If  $dk >= $TCM[$i+$j][1] And $dk <= $TCM[$i+$j][2] Then
					$n = $i
					$k = $i+$j
				ExitLoop
				Else
				EndIf
			Next
		Else
		EndIf
	Next

	For $t = $n to $k
		GUICtrlSetData($nInput3, $TCM[$t][0])
		$p1 = $p2
	Next
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
Тут логика такая
Если правильно понял
Код:
Dim $TCM =  [["ТСМ 20/0+5-12", 5, 12], _
            ["ТСМ 30/0+13-23", 13, 23], _
            ["ТСМ 40/0+24-33", 24, 33], _
            ["ТСМ 60/0+34-51", 34, 51], _
            ["ТСМ 90/0+52-78", 52, 78], _
            ["ТСМ 120/0+79-99", 79, 99]]

$dn = 12
$dk = 50

If $dn >= $dk Or $dn < $TCM[0][1] Or $dk > $TCM[UBound($TCM) - 1][2] Then Exit ConsoleWrite("Некорректный диапазон" & @CRLF)
ConsoleWrite($dn & "-" & $dk & ":" & @CRLF)

For $i = 0 To UBound($TCM) - 1
  If $dn <= $TCM[$i][2] Then
    For $i = $i To UBound($TCM) - 1
      If $dk > $TCM[$i][2] Then
        ConsoleWrite($TCM[$i][0] & @CRLF)
      Else
        ConsoleWrite($TCM[$i][0] & @CRLF)
        ExitLoop 2
      EndIf
    Next
  EndIf
Next
Но это фактически то же самое, что у вас. Кстати, непонятно, можно ли вводить диапазон меньше меньшего и больше большего. Сейчас у вас проверок нет и скрипт вылетает. А чтобы ввести в GUI "25" нужно сначала ввести "2" ;)

не очень корректно работает, мерцает
Код:
Select
        Case $dn <> $iInput1
            Cab($iInput1, $dn)
            $iInput1 = $dn ; <= добавить

        Case $dk <> $iInput2
            Cab($iInput2, $dk)
            $iInput2 = $dk ; <= добавить

    EndSelect
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
joparezzz [?]
Тут логика такая
IMHO тут нет логики.
наружный диаметр кабеля
Код:
$dn = 12 ; min
$dk = 25 ; max

У вас получается:
Код:
ТСМ 20/0+5-12 - only 12
ТСМ 30/0+13-23 - only 12
ТСМ 40/0+23-33 - 12 and 25

C таким же успехом:
Код:
ТСМ 60/0+34-51 - 12 and 25

Или я чего-то не понимаю, или одно из двух.
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Откорректировал скрипт.
Как сделать, что бы при возникновении ошибки скрипт не вылетал, а ждал пока введутся корректные данные?
Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $iInput1
Global $iInput2

GUICreate('Тест', 400, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput1 = GUICtrlCreateInput('12', 10, 10, 50, 20)
GUICtrlSetColor(-1, 0x505050)
$nInput2 = GUICtrlCreateInput('25', 10, 40, 50, 20)
GUICtrlSetColor(-1, 0x505050)
$nInput3 = GUICtrlCreateEdit('', 10, 70, 380, 100)

GUISetState()


Dim $TCM = 	[["ТСМ 20/0+5-12", 5, 12], _
			["ТСМ 30/0+13-23", 13, 23], _
			["ТСМ 40/0+23-33", 23, 33], _
			["ТСМ 60/0+34-51", 34, 51], _
			["ТСМ 90/0+52-78", 52, 78], _
			["ТСМ 120/0+79-99", 79, 99]]

While 1

	$dn = GUICtrlRead($nInput1)
	$dk = GUICtrlRead($nInput2)
	If $dn >= $dk Or $dn < $TCM[0][1] Or $dk > $TCM[UBound($TCM) - 1][2] Then Exit ConsoleWrite("Некорректный диапазон" & @CRLF)

    Select
		Case $dn <> $iInput1
            CabTCM()
            $iInput1 = $dn

        Case $dk <> $iInput2
            CabTCM()
            $iInput2 = $dk

    EndSelect

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func CabTCM()
  GUICtrlSetData($nInput3, $dn & '-' & $dk & ':' & @TAB)
  For $i = 0 To UBound($TCM) - 1
    If $dn <= $TCM[$i][2] Then
	  ;$n = $i
      For $i = $i To UBound($TCM) - 1
        If $dk > $TCM[$i][2] Then
          ConsoleWrite($TCM[$i][0] & ', ')
		  GUICtrlSetData($nInput3, $TCM[$i][0] & ', ', 1)
	    Else
		  ;$k = $i
          ConsoleWrite($TCM[$i][0] & @CRLF)
		  GUICtrlSetData($nInput3, $TCM[$i][0], 1)
          ExitLoop 2
        EndIf
      Next
    EndIf
  Next
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
ждал пока введутся корректные данные
Перенесите проверку из главного цикла в функцию
Код:
Func CabTCM()
  If Int($dn) >= Int($dk) Or $dn < $TCM[0][1] Or $dk > $TCM[UBound($TCM) - 1][2] Then Return GUICtrlSetData($nInput3, "Некорректный диапазон")
...
И проверьте массив диапазонов: у вас "23" в двух элементах. Вероятно "ТСМ40" должен быть "24-33".
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Спасибо, все работает корректно)

В каталоге производителя указано, что "ТСМ 30" для кабелей "13-23", "ТСМ 40" для кабелей "23-33".


Добавлено:
Сообщение автоматически объединено:

Добавил еще одного производителя кабельных вводов.
Только у них диапазоны перекрываются, соответственно надо изменить алгоритм.
Например для диапазона 10-25 мне надо, чтоб выводился кабельный ввод RM 30, а выводится RM 20, RM 20w40, RM 30.
Т.е. условие должно быть таким: если dn и dk лежат в пределах одного кабельного ввода, то вывести наименование этого кабельного ввода и выйти из цикла, при этом если для указанного диапазона соответствуют несколько кабельных вводов, то вывести не расширенные кабельные вводы (расширенные это RM 20w40, RM 40 10-32 и RM 60 24-54).

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $iInput1
Global $iInput2

GUICreate('Тест', 770, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput1 = GUICtrlCreateInput('', 10, 10, 40, 20)
$nInput2 = GUICtrlCreateInput('', 65, 10, 40, 20)
$nInput3 = GUICtrlCreateEdit('', 130, 10, 300, 100)
$nInput4 = GUICtrlCreateEdit('', 450, 10, 300, 100)

GUISetState()

Dim $TCM = 	[["ТСМ 20/0+5-12", 5, 12], _
			["ТСМ 30/0+13-23", 13, 23], _
			["ТСМ 40/0+23-33", 23, 33], _
			["ТСМ 60/0+34-51", 34, 51], _
			["ТСМ 90/0+52-78", 52, 78], _
			["ТСМ 120/0+79-99", 79, 99]]

Dim $RM = 	[["RM 20", 4, 14.5], _
			["RM 20w40", 3.5, 16.5], _
			["RM 30", 10, 25], _
			["RM 40", 21.5, 34.5], _
			["RM 40 10-32", 9.5, 32.5], _
			["RM 60", 28, 54], _
			["RM 60 24-54", 24, 54], _
			["RM 90", 48, 71], _
			["RM 120", 67.5, 99]]

While 1

	$dn = GUICtrlRead($nInput1)
	$dk = GUICtrlRead($nInput2)

    Select
		Case $dn <> $iInput1
            CabTCM()
			CabRM()
            $iInput1 = $dn

        Case $dk <> $iInput2
            CabTCM()
			CabRM()
            $iInput2 = $dk

    EndSelect

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func CabTCM()
  If Int($dn) > Int($dk) Or $dn < $TCM[0][1] Or $dk > $TCM[UBound($TCM) - 1][2] Then Return GUICtrlSetData($nInput3, "Некорректный диапазон")
  GUICtrlSetData($nInput3, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($TCM) - 1
    If $dn <= $TCM[$i][2] Then
	  ;$n = $i
      For $i = $i To UBound($TCM) - 1
        If $dk > $TCM[$i][2] Then
          ConsoleWrite($TCM[$i][0] & ', ')
		  GUICtrlSetData($nInput3, $TCM[$i][0] & ', ', 1)
	    Else
		  ;$k = $i
          ConsoleWrite($TCM[$i][0] & @CRLF)
		  GUICtrlSetData($nInput3, $TCM[$i][0], 1)
          ExitLoop 2
        EndIf
      Next
    EndIf
  Next
EndFunc

Func CabRM()
  If Int($dn) > Int($dk) Or $dn < $RM[0][1] Or $dk > $RM[UBound($RM) - 1][2] Then Return GUICtrlSetData($nInput4, "Некорректный диапазон")
  GUICtrlSetData($nInput4, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($RM) - 1
    If $dn <= $RM[$i][2] Then
	  ;$n = $i
      For $i = $i To UBound($RM) - 1
        If $dk > $RM[$i][2] Then
          ConsoleWrite($RM[$i][0] & ', ')
		  GUICtrlSetData($nInput4, $RM[$i][0] & ', ', 1)
	    Else
		  ;$k = $i
          ConsoleWrite($RM[$i][0] & @CRLF)
		  GUICtrlSetData($nInput4, $RM[$i][0], 1)
          ExitLoop 2
        EndIf
      Next
    EndIf
  Next
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OffTopic:
joparezzz
В каталоге производителя указано
Разве вы не видите, что границы диапазонов не накладываются - следующий диапазон начинается с +1 от текущего. И только в одном случае - исключение. Я бы на вашем месте уточнил, т.к. производители тоже ошибаются. Но, дело ваше.


joparezzz
если dn и dk лежат в пределах одного кабельного ввода, то вывести наименование этого кабельного ввода и выйти из цикла, при этом если для указанного диапазона соответствуют несколько кабельных вводов, то вывести не расширенные кабельные вводы
Код:
...
Dim $RM =   [["RM 20", 4, 14.5], _
            ["RM 30", 10, 25], _
            ["RM 40", 21.5, 34.5], _
            ["RM 60", 28, 54], _
            ["RM 90", 48, 71], _
            ["RM 120", 67.5, 99]]

Dim $RMe =  [["RM 20w40", 3.5, 16.5], _
            ["RM 40 10-32", 9.5, 32.5], _
            ["RM 60 24-54", 24, 54]]
...

Func CabRM()
  If Number($dn) > Number($dk) Or $dn < $RMe[0][1] Or $dk > $RM[UBound($RM) - 1][2] Then Return GUICtrlSetData($nInput4, "Некорректный диапазон")
  GUICtrlSetData($nInput4, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($RM) - 1
    If $dn >= $RM[$i][1] And $dk <= $RM[$i][2] Then Return GUICtrlSetData($nInput4, $RM[$i][0], 1)
  Next
  For $i = 0 To UBound($RMe) - 1
    If $dn >= $RMe[$i][1] And $dk <= $RMe[$i][2] Then Return GUICtrlSetData($nInput4, $RMe[$i][0], 1)
  Next
  GUICtrlSetData($nInput4, "Не найдено")
EndFunc
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Спасибо! все замечательно работает)
Единственное, если все же диапазон не входит в пределы одного кабельного ввода, то вместо сообщения "Не найдено" выводить несколько кабельных вводов перекрывающих диапазон с приоритетом массива RM.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
вместо сообщения "Не найдено" выводить несколько кабельных вводов перекрывающих диапазон
Код:
...
;~   GUICtrlSetData($nInput4, "Не найдено")
  For $i = 0 To UBound($RM) - 1
    If $dn >= $RM[$i][1] And $dn <= $RM[$i][2] Then
      For $i = $i To UBound($RM) - 1
        GUICtrlSetData($nInput4, $RM[$i][0] & ", ", 1)
        If $dk >= $RM[$i][1] And $dk <= $RM[$i][2] Then Return
      Next
    EndIf
  Next
EndFunc
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
При 23 – 35 выводится:
23 – 35: RM 30 (∅10-25), RM 40 (∅21,5-34,5), RM 60 (∅28-54),
Хотелось бы чтоб, RM 30 (∅10-25) не выводилось.
Тут, видимо, условию $dn >= $RM[$i][1] And $dn <= $RM[$i][2] соответствует как RM 30 (∅10-25), так и RM 40 (∅21,5-34,5).
Как сделать, чтоб если условию $dn >= $RM[$i][1] And $dn <= $RM[$i][2] удовлетворяет несколько значений (например, RM 30 (∅10-25) и RM 40 (∅21,5-34,5)), то выводилось последнее т.е. RM 40 (∅21,5-34,5).
и соответственно ответ был таким: 23 – 35: RM 40 (∅21,5-34,5), RM 60 (∅28-54)

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $iInput1
Global $iInput2

GUICreate('Тест', 770, 180, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput1 = GUICtrlCreateInput('23', 10, 10, 40, 20)
$nInput2 = GUICtrlCreateInput('35', 65, 10, 40, 20)
$nInput3 = GUICtrlCreateEdit('', 130, 10, 300, 100)
$nInput4 = GUICtrlCreateEdit('', 450, 10, 300, 100)

GUISetState()

Dim $TCM = 	[["ТСМ 20/0+5-12", 5, 12], _
			["ТСМ 30/0+13-23", 13, 23], _
			["ТСМ 40/0+23-33", 23, 33], _
			["ТСМ 60/0+34-51", 34, 51], _
			["ТСМ 90/0+52-78", 52, 78], _
			["ТСМ 120/0+79-99", 79, 99]]

Dim $RM =   [["RM 20 (∅4-14,5)", 4, 14.5], _
            ["RM 30 (∅10-25)", 10, 25], _
            ["RM 40 (∅21,5-34,5)", 21.5, 34.5], _
            ["RM 60 (∅28-54)", 28, 54], _
            ["RM 90 (∅48-71)", 48, 71], _
            ["RM 120 (∅67,5-99)", 67.5, 99]]

Dim $RMe =  [["RM 20w40 (∅3,5-16,5)", 3.5, 16.5], _
            ["RM 40 10-32 (∅9,5-32,5)", 9.5, 32.5], _
            ["RM 60 24-54 (∅24-54)", 24, 54]]

While 1

	$dn = GUICtrlRead($nInput1)
	$dk = GUICtrlRead($nInput2)

    Select
		Case $dn <> $iInput1
            CabTCM()
			CabRM()
            $iInput1 = $dn

        Case $dk <> $iInput2
            CabTCM()
			CabRM()
            $iInput2 = $dk

    EndSelect

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Func CabTCM()
  If Int($dn) > Int($dk) Or $dn < $TCM[0][1] Or $dk > $TCM[UBound($TCM) - 1][2] Then Return GUICtrlSetData($nInput3, "Некорректный диапазон")
  GUICtrlSetData($nInput3, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($TCM) - 1
    If $dn <= $TCM[$i][2] Then
	  ;$n = $i
      For $i = $i To UBound($TCM) - 1
        If $dk > $TCM[$i][2] Then
          ConsoleWrite($TCM[$i][0] & ', ')
		  GUICtrlSetData($nInput3, $TCM[$i][0] & ', ', 1)
	    Else
		  ;$k = $i
          ConsoleWrite($TCM[$i][0] & @CRLF)
		  GUICtrlSetData($nInput3, $TCM[$i][0], 1)
          ExitLoop 2
        EndIf
      Next
    EndIf
  Next
EndFunc

Func CabRM()
  If Number($dn) > Number($dk) Or $dn < $RMe[0][1] Or $dk > $RM[UBound($RM) - 1][2] Then Return GUICtrlSetData($nInput4, "Некорректный диапазон")
  GUICtrlSetData($nInput4, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($RM) - 1
    If $dn >= $RM[$i][1] And $dk <= $RM[$i][2] Then Return GUICtrlSetData($nInput4, $RM[$i][0], 1)
  Next
  For $i = 0 To UBound($RMe) - 1
    If $dn >= $RMe[$i][1] And $dk <= $RMe[$i][2] Then Return GUICtrlSetData($nInput4, $RMe[$i][0], 1)
  Next
  ;GUICtrlSetData($nInput4, "Не найдено")
  For $i = 0 To UBound($RM) - 1
    If $dn >= $RM[$i][1] And $dn <= $RM[$i][2] Then
      For $i = $i To UBound($RM) - 1
        GUICtrlSetData($nInput4, $RM[$i][0] & ", ", 1)
        If $dk >= $RM[$i][1] And $dk <= $RM[$i][2] Then Return
      Next
    EndIf
  Next
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
если условию <...> удовлетворяет несколько значений <...>, то выводилось последнее
Код:
...
  ;GUICtrlSetData($nInput4, "Не найдено")
  Local $j = -1, $RMt = $RM
  For $i = 0 To UBound($RM) - 1
    If $dn >= $RMt[$i][1] And $dn <= $RMt[$i][2] Then $j = $i
  Next
  If $j = -1 Then
    $RMt[0][0] = $RMe[0][0]
    $RMt[0][1] = $RMe[0][1]
    $RMt[0][2] = $RMe[0][2]
    $j = 0
  EndIf
  For $i = $j To UBound($RMt) - 1
    GUICtrlSetData($nInput4, $RMt[$i][0] & ", ", 1)
    If $dk >= $RMt[$i][1] And $dk <= $RMt[$i][2] Then Return
  Next
EndFunc
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Спасибо, все работает отлично.
Я тут откорректировал и добавил две функции CabTCM_1() и CabRM_1(), вроде все работает корректно.
Только выводит сначала более крупные кабельные вводы, как нибудь можно сделать сортировку по увеличению в Edit?
Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $iInput1
Global $iInput2

GUICreate('Тест', 770, 250, -1, -1, -1, $WS_CLIPCHILDREN)
$nInput1 = GUICtrlCreateInput('23', 10, 10, 40, 20)
$nInput2 = GUICtrlCreateInput('33', 65, 10, 40, 20)
$nInput3 = GUICtrlCreateEdit('', 130, 10, 300, 100)
$nInput4 = GUICtrlCreateEdit('', 450, 10, 300, 100)
$nInput5 = GUICtrlCreateEdit('', 130, 130, 300, 100)
$nInput6 = GUICtrlCreateEdit('', 450, 130, 300, 100)


GUISetState()

Dim $TCM = 	[["ТСМ 20/0+5-12", 5, 12], _
			["ТСМ 30/0+13-23", 13, 23], _
			["ТСМ 40/0+23-33", 23, 33], _
			["ТСМ 60/0+34-51", 34, 51], _
			["ТСМ 90/0+52-78", 52, 78], _
			["ТСМ 120/0+79-99", 79, 99]]

Dim $RM =   [["RM 20 (∅4-14,5)", 4, 14.5], _
            ["RM 30 (∅10-25)", 10, 25], _
            ["RM 40 (∅21,5-34,5)", 21.5, 34.5], _
            ["RM 60 (∅28-54)", 28, 54], _
            ["RM 90 (∅48-71)", 48, 71], _
            ["RM 120 (∅67,5-99)", 67.5, 99]]

Dim $RMe =  [["RM 20w40 (∅3,5-16,5)", 3.5, 16.5], _
            ["RM 40 10-32 (∅9,5-32,5)", 9.5, 32.5], _
            ["RM 60 24-54 (∅24-54)", 24, 54]]

While 1
	$dn = GUICtrlRead($nInput1)
	$dk = GUICtrlRead($nInput2)

    Select
		Case $dn <> $iInput1
            CabTCM()
			CabTCM_1()
			CabRM()
			CabRM_1()
            $iInput1 = $dn

        Case $dk <> $iInput2
            CabTCM()
			CabTCM_1()
			CabRM()
			CabRM_1()
            $iInput2 = $dk

    EndSelect

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func CabTCM()
  If Int($dn) > Int($dk) Or $dn < $TCM[0][1] Or $dk > $TCM[UBound($TCM) - 1][2] Then Return GUICtrlSetData($nInput3, "Некорректный диапазон")
  GUICtrlSetData($nInput3, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($TCM) - 1
    If $dn <= $TCM[$i][2] Then
	  ;$n = $i
      For $i = $i To UBound($TCM) - 1
        If $dk > $TCM[$i][2] Then
          ConsoleWrite($TCM[$i][0] & ', ')
		  GUICtrlSetData($nInput3, $TCM[$i][0] & ', ', 1)
	    Else
		  ;$k = $i
          ConsoleWrite($TCM[$i][0] & @CRLF)
		  GUICtrlSetData($nInput3, $TCM[$i][0], 1)
          ExitLoop 2
        EndIf
      Next
    EndIf
  Next
EndFunc

Func CabRM()
  If Number($dn) > Number($dk) Or $dn < $RMe[0][1] Or $dk > $RM[UBound($RM) - 1][2] Then Return GUICtrlSetData($nInput4, "Некорректный диапазон")
  GUICtrlSetData($nInput4, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($RM) - 1
    If $dn >= $RM[$i][1] And $dk <= $RM[$i][2] Then Return GUICtrlSetData($nInput4, $RM[$i][0], 1)
  Next
  For $i = 0 To UBound($RMe) - 1
    If $dn >= $RMe[$i][1] And $dk <= $RMe[$i][2] Then Return GUICtrlSetData($nInput4, $RMe[$i][0], 1)
  Next
  ;GUICtrlSetData($nInput4, "Не найдено")
   Local $j = -1
  For $i = 0 To UBound($RM) - 1
    If $dn >= $RM[$i][1] And $dn <= $RM[$i][2] Then $j = $i
  Next
  If $j = -1 Then
    $RM[0][0] = $RMe[0][0]
    $RM[0][1] = $RMe[0][1]
    $RM[0][2] = $RMe[0][2]
    $j = 0
  EndIf
  For $i = $j To UBound($RM) - 1
    GUICtrlSetData($nInput4, $RM[$i][0] & ", ", 1)
    If $dk >= $RM[$i][1] And $dk <= $RM[$i][2] Then Return
  Next
EndFunc


Func CabTCM_1()
  If Number($dn) > Number($dk) Or $dn < $TCM[0][1] Or $dk > $TCM[UBound($TCM) - 1][2] Then Return GUICtrlSetData($nInput5, "Некорректный диапазон")
  GUICtrlSetData($nInput5, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($TCM) - 1
    If $dk <= $TCM[$i][2] Then
	  For $i = $i To 0 Step -1
		  If $dn >= $TCM[$i][1] Then
			GUICtrlSetData($nInput5, $TCM[$i][0], 1)
		    ExitLoop 2
		  Else
			GUICtrlSetData($nInput5, $TCM[$i][0] & ', ', 1)
		  EndIf
	  Next
	  Else
	EndIf
  Next
EndFunc

Func CabRM_1()
  If Number($dn) > Number($dk) Or $dn < $RMe[0][1] Or $dk > $RM[UBound($RM) - 1][2] Then Return GUICtrlSetData($nInput6, "Некорректный диапазон")
  GUICtrlSetData($nInput6, $dn & ' – ' & $dk & ':' & @TAB)
  For $i = 0 To UBound($RM) - 1
    If $dn >= $RM[$i][1] And $dk <= $RM[$i][2] Then Return GUICtrlSetData($nInput6, $RM[$i][0], 1)
  Next
  For $i = 0 To UBound($RMe) - 1
    If $dn >= $RMe[$i][1] And $dk <= $RMe[$i][2] Then Return GUICtrlSetData($nInput6, $RMe[$i][0], 1)
  Next
  For $i = 0 To UBound($RM) - 1
    If $dk <= $RM[$i][2] Then
	  For $i = $i To 0 Step -1
		  If $dn >= $RM[$i][1] Then
			GUICtrlSetData($nInput6, $RM[$i][0], 1)
		    ExitLoop 2
		  Else
			GUICtrlSetData($nInput6, $RM[$i][0] & ', ', 1)
		  EndIf
	  Next
	  Else
	EndIf
  Next
EndFunc
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
joparezzz [?]
как нибудь можно сделать сортировку по увеличению в Edit?

Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.




Спасибо, все работает отлично.

[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joparezzz
Отредактировал ответ #16 - исправил проблему перезаписи глобального массива.
 
Верх